如果您使用仿函数,即定义 的类的对象operator()
,您可以以与函数相同的方式使用它(例如,代替您现在使用的回调函数),但在类的数据成员中您可以存储状态信息。类似这样的东西:
class CallbackObject {
int _state_information;
public:
CallbackObject():_state_information(0) {}
void operator()(int some_data_to_process) {
/* ..process data.. */
++_state_information; // Update internal state
}
};
那么这个类的对象可以像回调函数一样使用。
但是,如果可以使用 C++11,有一种特别方便的方法可以实现类似的效果,即使用捕获 lambda:
#include <iostream>
/* This is our "backend" that calls the callback
function: */
template <typename Callback>
void process(int data, Callback callback) {
callback(data);
}
int main()
{
/* State information: */
int num_calls = 0;
/* Here we define the callback function as a lambda: */
auto callback = [&num_calls](int data) { ++num_calls; };
/* Have it called a few times: */
for (int i = 0 ; i < 10 ; ++i)
process(i,callback);
std::cout << "Callback was called " << num_calls << " times." << std::endl;
return 0;
}
函数中的callback
变量main
存储了 lambda 函数。[&num_calls]
意味着整数变量num_calls
被捕获为引用,因此在调用 lambda 时对其值所做的任何更改都将直接影响原始变量num_calls
。因此,您可以使用捕获的引用num_calls
(当然可能是更复杂的类型或多个变量)来存储和更新状态信息。