让回调记住一些信息的好方法(C ++)

时间:2012-10-16 14:17:16

标签: c++ callback

我在我的程序中使用了一个回调,这个回调将被重复调用,所以我想用一些方法存储当前信息,以便他能记住他在哪里。我想创建一个类,并使用一些静态成员来存储它们,但我认为它不好......我想要一些建议,非常感谢!!

实际上,我更喜欢使用结构或类,我给出了一个简单的例子。

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类的对象,但我不想这样做,所以我选择使用静态成员,但我认为应该有更好的方法。

3 个答案:

答案 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(当然可能是更复杂的类型,或多个变量)来存储和更新状态信息。