将函数引用添加到列表中

Add function reference to list

本文关键字:列表 添加 函数 引用      更新时间:2023-10-16

我的问题很简单,但我在谷歌上找不到任何关于它的信息(可能是因为我是c++的新手,还不太了解正确的术语)。我的问题是,我是否可以在列表中添加对函数的引用,如果可以,正确的方法是什么?

基本上,我想做的是创建一个事件类,它可以将函数引用存储在列表中,这样我就可以进行一些基本的事件处理。

我想做的事情是这样的:

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

这样的事情可能发生吗
请注意,如果我可以在没有任何事件库的情况下这样做,我希望避免使用任何事件库。

当然,这是可能的:

#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()>保存一个函数对象,该对象封装了一个不接受参数且不返回结果的可调用对象。

演示。

使用以下内容:

/* 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();
    }
}