2014-11-02 34 views
0

我的问题是相当简单,但我无法在谷歌上找到任何有关它的信息(可能是因为我是C++新手,并不完全了解所有东西的正确术语)。我的问题是,是否有可能在列表中添加对函数的引用,如果是这样,那么执行该操作的正确方法是什么?添加函数引用列表

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

做什么即时通讯思想是这样的:

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

是这样的可能吗?
请注意,如果我无法使用任何事件库,我想避免使用任何事件库。

回答

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(); 
    } 
} 
+0

好的,谢谢。这似乎相对容易实施。但是如果我要调用一个可以接受参数的函数呢?我只是将'void(void)'改为'void(type)'?编辑:谢谢。我在更新之前发布了这个问题。这看起来可以理解。 – 2014-11-02 13:24:47

+2

typedef std :: function function;您可以。 – wshcdr 2014-11-02 13:30:54

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