を指すのstd ::目的球を作り、私は関数ポインタに私は2つの機能</p> <pre><code>void foo() { std::cout << 1 << std::endl; } void bar() { std::cout << 2 << std::endl; } </code></pre> <p>をお持ちの場合は2個の関数のC++
std::function<void()> v;
を持っていると私は
1
2
を印刷する
v()
をしたいです
を指すのstd ::目的球を作り、私は関数ポインタに私は2つの機能</p> <pre><code>void foo() { std::cout << 1 << std::endl; } void bar() { std::cout << 2 << std::endl; } </code></pre> <p>をお持ちの場合は2個の関数のC++
std::function<void()> v;
を持っていると私は
1
2
を印刷する
v()
をしたいです
std::function
ターゲットの定義はconst T* target() const
です。つまり、1つのtアゼット。
This question has been asked beforeのように、イベントハンドラのコンテキストでは、CLR/.NETでは「デリゲートマルチキャスティング」と呼ばれています。
いくつかの可能な解決策があります:
は、最初は手動でマルチキャストを定義するためにラムダまたは他の機能を使用することです:
function<void()> v = []() {
foo();
bar();
};
v();
秒がフル独自に定義することですstd::function
-esqueこれは、可変数のターゲットをサポートします。 template
配列で実行することができます(実行時にはvector
の使用を避ける)...とにかくvector
を使用してください。
template<class FuncType>
class MulticastFunction {
private:
vector<std::function<FuncType>> targets;
public:
void operator()() {
for(auto& target : this->targets) {
target();
}
}
void addTarget(FuncType& target) {
this->targets->push_back(target);
}
}
使用法:
MulticastFunction<void()> mc;
mc.addTarget(foo);
mc.addTarget(bar);
mc();
おそらく 'target'が値またはconst refであるようにしたいので、例えばlambdaにバインドすることができます –
ラムダを使用し
第三の選択肢は、単純にとにかく(:pseudocodeish警告)
vector
をラップするのですか?あなたの質問は何ですか? – hyde@hydeこれは '[](){foo(); bar();}'でしょうか? – Julian
戻り値の型が* '*'ではない場合、あなたは何を期待しますか? – o11c