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

C++ 让回调函数记住一些信息的好方法(C+;+;),c++,callback,C++,Callback,我在我的程序中使用了一个回调函数,这个回调函数会被反复调用,所以我想用一些方法来存储当前的信息,这样他就能记住自己在哪里。我想创建一个类,并使用一些静态成员来存储它们,但我认为这并不好…我想要一些建议,非常感谢 事实上,我更喜欢使用结构或类,我给出了一个简单的例子来说明我的想法 callback(parameters) { A* a->setcounter(record current value); A* a->getcounter(get current value)

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

事实上,我更喜欢使用结构或类,我给出了一个简单的例子来说明我的想法

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

让回调函数中的参数成为上下文对象,即封装状态信息的结构类型或类的某个实例,该信息对回调函数识别程序的状态非常有用。回调函数可以在此状态上进行谓词,以了解要执行的操作。

函数中的静态变量不执行此操作有什么原因吗

int my_callback(int i)
{
    static int my_int;
    if (i != -1) my_int = i;

    return my_int;
}

在本例中,向my_callback传递任何值都会将该值赋给回调的静态变量,除了
-1
,该变量将返回当前值而不赋给它。

如果使用函子,即定义
运算符()
的类的对象,则可以将其作为函数使用(例如,在您现在使用的回调函数的位置),但在类的数据成员中,您可以存储状态信息

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:

#包括
/*这是我们调用回调的“后端”
功能:*/
模板
无效进程(int数据、回调){
回调(数据);
}
int main()
{
/*国家信息:*/
int num_calls=0;
/*这里我们将回调函数定义为lambda:*/
自动回调=[&num_调用](int数据){++num_调用;};
/*它打过几次电话:*/
对于(int i=0;i<10;++i)
过程(i,回调);

std::cout Omaha的解决方案可能更可取,但如果您无法让调用者将内容传递给回调,这将起作用。好主意,但回调的类型和调用方式已经由其他人定义,因此我可以修改在其中存储状态信息的方式。@CJAN.LEE在这种情况下,您能描述一下吗(使用精确的C++语法)应该是什么类型的回调?它是否像我在这个问题中写的?
#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;
}