3

在 C# 中,我们可以说:

Action act = ()=> {/*stuff*/}; 
act += ()=> {/*another stuff*/}` 

然后调用act().

我想知道如何在 C++ 中做这样的事情(现在使用 lambdas 将非常有用,如果可能的话不使用 Boost/Qt 信号)?

4

2 回答 2

6

也许与std::functions:

std::vector<std::function<void()>> act;

act.emplace_back([] { /* stuff */ });
act.emplace_back([] { /* more stuff */ });

致电:

for (auto & f : act) { f(); }
于 2012-09-16T23:39:19.073 回答
5

std::vector<std::function<void()>>通过用 lambda 填充 a 并调用每个函数对象,您可以相当容易地编写这样的东西。

#include <vector>
#include <functional>
#include <utility>

// warning: very crude and likely with typos / bugs
template<class Sig>
struct Action{
  template<typename Functor>
  void operator+=(Functor&& f)
  { _funcs.emplace_back(std::forward<Functor>(f)); }
  template<class... Args>
  void operator()(Args&&... args) const{
    for(auto& f : _funcs)
      f(args...);
  }
private:
  std::vector<std::function<Sig>> _funcs;
};

// ...
Action<void()> act;
act += []{ /*...*/ };
act += []{ /*...*/ };
act(); // invoke all handlers in order

但是,据我所知,C# 还允许您使用删除处理程序-=,这在 C++ 中并不容易完成。您需要返回一个令牌+=,可以从中传递该令牌-=以删除该特定处理程序。

于 2012-09-16T23:39:04.150 回答