Question

I have no idea if this is possible, but if it is, what would the syntax look like?

If not possible, why not?

Was it helpful?

Solution

You should be able to bind to a message implementation (IMP), which are just plain C functions with two hidden parameters, self and _cmd of types id and SEL respectively.

EDIT: Just tested the following complete example, and it appears to work.

#include <stdio.h>
#include <boost/bind.hpp>
#include <Foundation/NSObject.h>

@interface MyClass : NSObject
{
}
-(int) doSomething:(int)arg;
@end

@implementation MyClass
-(int) doSomething:(int)arg
{
  printf("doSomething: self=0x%08x _cmd=0x%08x\n", self, _cmd);
  return arg + 1;
}
@end

int main(void)
{
  MyClass *myObj = [[MyClass alloc] init], *otherObj = [[MyClass alloc] init];
  typedef int (*MyFunc)(id, SEL, int);
  SEL doSomething_sel = @selector(doSomething:);
  MyFunc doSomething_impl = (MyFunc)[myObj methodForSelector:doSomething_sel];

  // bind self & _cmd arguments:
  // calls [myObj doSomething:x]
  int result = boost::bind(doSomething_impl, myObj, doSomething_sel, _1)(14);
  printf("result1: %d\n", result);

  // bind _cmd & arg:
  // calls [otherObj doSomething:3]
  result = boost::bind(doSomething_impl, _1, doSomething_sel, 42)(otherObj);
  printf("result2: %d\n", result);

  return 0;
}

With GNUstep, compile as:

gcc objcbind.mm -o objcbind -I/usr/include/GNUstep -lobjc -lstdc++ -lgnustep-base

On Mac OS X, compile as:

gcc objcbind.mm -o objcbind -framework Foundation -lstdc++

Output:

doSomething: self=0x01a85f70 _cmd=0x00602220
result1: 15
doSomething: self=0x01a83d70 _cmd=0x00602220
result2: 43
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top