你可以让你自己的类做和 boost 绑定函数一样的事情。该类所要做的就是接受函数类型和指向包含该函数的对象的指针。例如,这是一个 void return 和 void param 委托:
template<typename owner>
class VoidDelegate : public IDelegate
{
public:
VoidDelegate(void (owner::*aFunc)(void), owner* aOwner)
{
mFunction = aFunc;
mOwner = aOwner;
}
~VoidDelegate(void)
{}
void Invoke(void)
{
if(mFunction != 0)
{
(mOwner->*mFunction)();
}
}
private:
void (owner::*mFunction)(void);
owner* mOwner;
};
用法:
class C
{
void CallMe(void)
{
std::cout << "called";
}
};
int main(int aArgc, char** aArgv)
{
C c;
VoidDelegate<C> delegate(&C::CallMe, &c);
delegate.Invoke();
}
现在,既然VoidDelegate<C>
是一个类型,拥有这些的集合可能是不切实际的,因为如果列表也包含 B 类的函数怎么办?它不能。
这就是多态性发挥作用的地方。你可以创建一个接口 IDelegate,它有一个函数 Invoke:
class IDelegate
{
virtual ~IDelegate(void) { }
virtual void Invoke(void) = 0;
}
如果VoidDelegate<T>
实现 IDelegate,您可以拥有 IDelegate 的集合,因此可以对不同类类型中的方法进行回调。