Мне не удалось найти его в 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
Использование этого класса в Задаче 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