【问题标题】:Add function reference to list将函数引用添加到列表
【发布时间】:2014-12-29 06:00:12
【问题描述】:

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

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

我想做的事情是这样的:

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

这样的事情可能吗?
请注意,如果我可以不使用任何事件库,我希望避免使用任何事件库。

【问题讨论】:

    标签: c++ list function


    【解决方案1】:

    当然,这是可能的:

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

    Demo.

    【讨论】:

      【解决方案2】:

      使用以下:

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

      【讨论】:

      • 好的,谢谢。这似乎比较容易实现。但是如果我要调用一个可以接受参数的函数呢?我可以将void(void) 更改为void(type) 吗?编辑:谢谢。我在更新之前发布了这个问题。这看起来可以理解。
      • typedef std::function 函数;你可以。
      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多