在 C# 中,我们可以说:
Action act = ()=> {/*stuff*/};
act += ()=> {/*another stuff*/}`
然后调用act()
.
我想知道如何在 C++ 中做这样的事情(现在使用 lambdas 将非常有用,如果可能的话不使用 Boost/Qt 信号)?
也许与std::function
s:
std::vector<std::function<void()>> act;
act.emplace_back([] { /* stuff */ });
act.emplace_back([] { /* more stuff */ });
致电:
for (auto & f : act) { f(); }
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++ 中并不容易完成。您需要返回一个令牌+=
,可以从中传递该令牌-=
以删除该特定处理程序。