我有一系列回调,对输入数据做一些工作,然后在该系列中调用下一个回调。看这个简单的例子(每个回调系列递增并打印值):
#include <stdio.h>
//#include <boost/bind.hpp>
//#include <boost/function.hpp>
//typedef boost::function<void (int i)> DataCallback;
typedef void (*DataCallback)(int i);
class A
{
public:
DataCallback dataCallback;
void RegisterCallback(DataCallback callback);
void Callback(int i);
};
void A::RegisterCallback(DataCallback callback)
{
dataCallback = callback;
}
void A::Callback(int i)
{
dataCallback(++i);
printf("Callback. i = %i", i);
}
int main (void)
{
A a1, a2, a3;
//a1.RegisterCallback(boost::bind(&A::Callback, &a2));
//a2.RegisterCallback(boost::bind(&A::Callback, &a3));
a1.RegisterCallback(a2.Callback);
a2.RegisterCallback(a3.Callback);
a3.Callback(1);
return 0;
}
但我有一个问题。在 C++ 中,您不能将类成员函数用作回调。据我所知,这个问题的解决方案是将回调函数设为静态。但在这种情况下,我不能使用课堂内字段。为了解决这个问题,我可以提供指向类(this)的回调指针并在回调中使用它。但是,就我而言,这意味着我应该向最低回调 (a3.Callback) 提供指向 a2 和 a1 的指针。
在我的真实项目中,我有大约 6 个回调并向第 6 个回调提供指向其他 5 个的指针——我认为这是一个坏主意。
所以,我的问题是——如何实现这一系列回调?
正如您在代码中看到的,我尝试使用 boost::function 和 boost::bind,但 MSVS2005 在编译时崩溃(优化的编译器已停止工作...),并在 mem_fn.hpp@318 处出现警告 C4180。这里有什么问题,这是解决我的问题的最佳方法吗?