在C++中实现多态行为时,可以使用纯虚函数或函数指针(或functor)。例如,可以通过以下方式实现异步回调:
方法1
class Callback
{
public:
Callback();
~Callback();
void go();
protected:
virtual void doGo() = 0;
};
//Constructor and Destructor
void Callback::go()
{
doGo();
}
如果要在这里使用回调函数,您需要重写doGo()方法以调用您想要的任何函数。
方法二
typedef void (CallbackFunction*)(void*)
class Callback
{
public:
Callback(CallbackFunction* func, void* param);
~Callback();
void go();
private:
CallbackFunction* iFunc;
void* iParam;
};
Callback::Callback(CallbackFunction* func, void* param) :
iFunc(func),
iParam(param)
{}
//Destructor
void go()
{
(*iFunc)(iParam);
}
要在此处使用回调方法,您需要创建一个函数指针,以便由Callback对象调用。
方法三
[这是我(安德烈亚斯)添加到问题中的;它不是原始发布者编写的]
template <typename T>
class Callback
{
public:
Callback() {}
~Callback() {}
void go() {
T t; t();
}
};
class CallbackTest
{
public:
void operator()() { cout << "Test"; }
};
int main()
{
Callback<CallbackTest> test;
test.go();
}
每种实现方式都有什么优缺点?
go()
可以是一个模板函数,可以接受 任一 函数指针或具有重载的operator()(void*)
的类。 - Nicolás