我在我的程序中使用了一个回调,这个回调将被重复调用,所以我想用一些方法存储当前信息,以便他能记住他在哪里。我想创建一个类,并使用一些静态成员来存储它们,但我认为它不好......我想要一些建议,非常感谢!!
实际上,我更喜欢使用结构或类,我给出了一个简单的例子。
callback(parameters)
{
A* a->setcounter(record current value);
A* a->getcounter(get current value);
A* a->addcounter(current value ++);
A* a->calculate(do some calculation with values);
}
让我困惑的是我应该首先创建一个A类的对象,但我不想这样做,所以我选择使用静态成员,但我认为应该有更好的方法。
答案 0 :(得分:1)
在回调函数中有一个参数是一个上下文对象,它是一个结构类型或类的实例,它包含对回调函数有用的状态信息,以识别程序的状态。回调函数可以预测此状态以了解要执行的操作。
答案 1 :(得分:0)
是否有某些原因,函数中的静态变量不会这样做?
int my_callback(int i)
{
static int my_int;
if (i != -1) my_int = i;
return my_int;
}
在此示例中,将任何值传递给my_callback会将该值分配给回调的静态变量,但-1
除外,它将返回当前值而不分配给它。
答案 2 :(得分:0)
如果使用仿函数,即定义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,使用捕获lambdas来实现类似效果有一种特别方便的方法:
#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
(当然可能是更复杂的类型,或多个变量)来存储和更新状态信息。