2

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

实际上,我更喜欢使用结构或类,我举一个简单的例子来说明我的想法。

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

4

3 回答 3

1

让回调函数中的参数是上下文对象,即包装状态信息的结构类型或类的某个实例,这些信息对回调函数用于识别程序的状态是有用的。回调函数可以基于此状态来了解要执行的操作。

于 2012-10-16T14:19:35.510 回答
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,有一种特别方便的方法可以实现类似的效果,即使用捕获 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(当然可能是更复杂的类型或多个变量)来存储和更新状态信息。

于 2012-10-16T14:38:34.533 回答
0

函数中的静态变量是否有某些原因不会这样做?

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

    return my_int;
}

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

于 2012-10-16T14:21:16.217 回答