我的问题很简单,但是我无法在谷歌上找到任何关于它的东西(可能是因为我是c ++的新手并且还不知道所有内容的正确术语)。我的问题是,我是否可以在列表中添加对函数的引用,如果是,那么正确的方法是什么?
基本上我想要做的是创建一个能够在列表中存储函数引用的事件类,以便我可以进行一些基本的事件处理。
我想做的事情是这样的:
list<function> fnlist;
void add(function fn) {
fnlist.add(fn);
}
void call() {
for (function &fn: fnlist) {
fn();
}
}
这样的事情可能吗?
请注意,如果我可以在没有任何事件库的情况下执行此操作,我希望避免使用任何事件库。
答案 0 :(得分:4)
当然,这是可能的:
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
void quick() {
cout << "quick ";
}
void brown() {
cout << "brown ";
}
void fox() {
cout << "fox ";
}
int main() {
vector<function<void()> > events;
events.push_back(quick);
events.push_back(brown);
events.push_back(fox);
for (auto f : events) {
f();
}
return 0;
}
使用std::function<void()>
来保存一个功能对象,该对象封装一个不带参数的可调用对象,并且不返回结果。
答案 1 :(得分:3)
使用以下内容:
/* ret_type : Return Type,
arg_type - type of argument (can be multiple, separated by comma)
*/
typedef std::function<ret_type( arg_type )> function ;
std::list < function> fnlist ;
void add(function fn)
{
fnlist.add(fn);
}
void call()
{
for (const auto &fn: fnlist)
{
fn();
}
}