我想创建一个回调映射到同一层次结构的不同对象,但我收到以下错误:
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();
}
我该如何解决该错误?