添加函数引用到列表

时间:2014-11-02 13:17:16

标签: c++ list function

我的问题很简单,但是我无法在谷歌上找到任何关于它的东西(可能是因为我是c ++的新手并且还不知道所有内容的正确术语)。我的问题是,我是否可以在列表中添加对函数的引用,如果是,那么正确的方法是什么?

基本上我想要做的是创建一个能够在列表中存储函数引用的事件类,以便我可以进行一些基本的事件处理。

我想做的事情是这样的:

list<function> fnlist;
void add(function fn) {
    fnlist.add(fn);
}
void call() {
    for (function &fn: fnlist) {
        fn();
    }
}

这样的事情可能吗?
请注意,如果我可以在没有任何事件库的情况下执行此操作,我希望避免使用任何事件库。

2 个答案:

答案 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()>来保存一个功能对象,该对象封装一个不带参数的可调用对象,并且不返回结果。

Demo

答案 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();
    }
}