使用状态作为参数在c ++

时间:2018-03-15 23:02:27

标签: c++ c++11 callback

我正在尝试使用Functor对象实现一个简单的回调。我有一个带有print(string)函数的Caller类,它调用传递输入字符串的回调。在回调中,我正在收集所有字符串,稍后在printEverything方法中打印它。但即使回调正在发生(由输出验证),但没有任何内容以printEverything方法打印。

class Callback {
public:
  Callback() {
    cout << "constructing Callback..." << std::endl;
  }

  void operator()(std::string data) {
    cout << "Adding record in callback: " << data << std::endl;
    records.push_back(data);
  }

  void printEverything() {
    cout << "Printing everything: " << std::endl;
    for(auto a : records) {
      cout << a;
    }
  }

private:
  std::vector<string> records;
};

class Caller {
public:
  template <typename Func>
  Caller(Func&& func) : cb_ (func){
  }

  void print(std::string str) {
    cb_(str);
    cout << "Printing in caller: " << str << std::endl;
  }

private:
  std::function<void(std::string)> cb_;
};


int main(int argc, char **argv) {
  Callback callback;
  Caller caller(callback);

  caller.print("Hello");
  caller.print("World");

  callback.printEverything(); // This doesn't print any records
}

输出:

constructing Callback...
Adding record in callback: Hello
Printing in caller: Hello
Adding record in callback: World
Printing in caller: World
Printing everything: 

看起来,回调发生在与我在主范围内不同的对象上。任何想法在这里出了什么问题?

1 个答案:

答案 0 :(得分:3)

undefined个副本(如果你移入它的话会移动)你传递给它的函数(参见它的constructor)。因此,回调 发生在与std::function不同的对象上。

如果您想传递对该函数的引用,请使用std::ref - 它有一个callback

operator()

Live on Wandbox