我在stackoverflow上找不到它。我想出了这种方法。请建议是否有更好的方法来做到这一点。
代码:
C++ 类:
struct CmdObj{
int value;
...
};
class CallBack{
public:
virtual void operator()(CmdObject &cmdObj) = 0;
};
#ifdef __OBJC__
//For objective c class
template <class T>
class CallBackImpl: public CallBack{
public:
CallBackImpl(T* _object, SEL _method): object(_object), method(_method){}
virtual void operator()(CmdObject &cmdObj){
NSValue *anObj = [NSValue value:&cmdObj withObjCType:@encode(CmdObject)];
[object performSelector:method withObject:anObj];
}
private:
SEL method;
T* object;
};
#endif
在Objective C中使用这个类:
@interface Callee{
CallBack *delegate;
}
- (void) callbackMethod:(NSValue *) anObj;
@end
@implementation
- (id) initCallee{
delegate = new CallBackImpl<Callee>(self, @selector(callbackMethod:);
}
- (void) callbackMethod:(NSValue *) anObj
{
CmdObject cmdObj;
[anObj getValue:&cmdObj];
int value = cmdObj.value;
...
}
- (void) callDelegate: (NSInteger _value)
{
if(delegate == NULL ) return;
CmdObject cmdObj;
cmdObj.value = _value;
(*delegate)(cmdObj);
}
@end