0

我想创建一个回调映射到同一层次结构的不同对象,但我收到以下错误:

class ResponseBase
{
public:
    virtual bool Parse() = 0;
};

class MyResponse : public ResponseBase
{
public:
    bool Parse() { return true; }
    void SayHello() {}
};

typedef std::tr1::function<void (ResponseBase*)> MYCALLBACK;
typedef std::map<int, MYCALLBACK> MYCALLBACKS;

MYCALLBACKS myCallbacks;

void RegisterCallback(int nType, MYCALLBACK myCallback)
{
    MYCALLBACKS::iterator iter = myCallbacks.find(nType);
    if (iter == myCallbacks.end())
        myCallbacks[nType] = myCallback;
    else
        iter->second = myCallback;
}

void Callback0(ResponseBase *pResponseBase) {}
void Callback1(MyResponse *pMyResponse) {}

int main()
{
    RegisterCallback(0, Callback0); // OK
    RegisterCallback(1, Callback1); // error C2664: 'void (MyResponse *)' : cannot convert parameter 1 from 'ResponseBase *' to 'MyResponse *'

    return 0;
}

但我想避免做这样的事情:

void Callback1(ResponseBase *pResponseBase)
{
    MyResponse *p = static_cast<MyResponse*>(pResponseBase);
    p->SayHello();
}

我该如何解决该错误?

4

0 回答 0