Вызов метода Objective-C из C ++ с использованием шаблона и шаблона команды - PullRequest
1 голос
/ 21 мая 2011

Мне не удалось найти его в 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
...