6

私は本質的に次のコードを持っています:

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));

このような場合、ヘルパー関数なしで実行することは可能ですか?

4

4 に答える 4

7

確かに、ラムダ:

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
于 2012-04-20T17:13:24.873 に答える
4

ラムダを次のように使用しないのはなぜですか。

std::for_each(triggers.begin(), 
              triggers.end(), 
              [&](fnChangeEvent & e) 
              {
                   e(zot);
              });

または、範囲ベースの for ループを次のように使用します。

for (auto& e : triggers)  { e(zot); }

より簡潔できれいに見えます。

于 2012-04-20T17:15:31.470 に答える
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);
于 2012-04-20T17:41:06.110 に答える
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));
于 2016-02-29T14:36:00.053 に答える