我正在尝试使用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:
看起来,回调发生在与我在主范围内不同的对象上。任何想法在这里出了什么问题?
答案 0 :(得分:3)
undefined
个副本(如果你移入它的话会移动)你传递给它的函数(参见它的constructor)。因此,回调 发生在与std::function
不同的对象上。
如果您想传递对该函数的引用,请使用std::ref
- 它有一个callback
:
operator()