我实质上有以下代码:
typedef std::function<void ()> fnGlobalChangeEvent;
typedef std::vector<fnGlobalChangeEvent> GlobalTriggers;
inline void ExecuteGlobal(fnGlobalChangeEvent ev)
{
ev();
}
GlobalTriggers triggers;
std::for_each(triggers.begin(), triggers.end(), std::bind(&ExecuteGlobal, _1));
在这里使用ExecuteGlobal感觉完全是多余的,但是我找不到正确的语法来退出呼叫。
std::for_each(triggers.begin(), triggers.end(), ExecuteGlobal(_1));
std::for_each(triggers.begin(), triggers.end(), std::bind(_1));
两者都无法编译。
还有一个更复杂的案例:
typedef std::function<void (Zot&)> fnChangeEvent;
typedef std::vector<fnChangeEvent> Triggers;
inline void Execute(fnChangeEvent ev, Zot& zot)
{
ev(zot);
}
Triggers triggers;
std::for_each(triggers.begin(), triggers.end(), std::bind(&Execute, _1, zot));
在这些情况下是否可以不使用辅助函数?
答案 0 :(得分:7)
当然,一个lambda:
std::for_each(
triggers.begin(), triggers.end(),
[](fnChangeEvent ev) { ev(); }
);
std::for_each(
triggers.begin(), triggers.end(),
[&zot](fnChangeEvent ev) { ev(zot); }
);
甚至更好,范围:
for (auto ev : triggers) {
ev();
}
// well, I think you can figure out the second one
答案 1 :(得分:4)
为什么不将lambda用作:
std::for_each(triggers.begin(),
triggers.end(),
[&](fnChangeEvent & e)
{
e(zot);
});
或者使用基于范围的for循环:
for (auto& e : triggers) { e(zot); }
看起来更简洁,更清洁。
答案 2 :(得分:1)
这是我刚才想到的事情,请告诉我它是否与你所寻找的一样:
template<typename IT, typename ...Args>
void call_each(IT begin_, IT end_, Args&&... args)
{
for (auto i = begin_; i!=end_; ++i)
(*i)(std::forward<Args>(args)...);
}
然后你可以像这样使用它:
call_each(triggers.begin(), triggers.end());
对于带参数的函数:
call_each(triggers.begin(), triggers.end(), zot);
答案 3 :(得分:0)
只是,所以我不会忘记这个选项:
typedef std::function<void ()> fnGlobalChangeEvent;
typedef std::vector<fnGlobalChangeEvent> GlobalTriggers;
GlobalTriggers triggers;
using namespace std::placeholders;
std::for_each(triggers.begin(), triggers.end(), std::bind(&fnGlobalChangeEvent::operator(), _1));