2016-04-15 25 views
1

を指すの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()をしたいです
+3

ラムダを使用し

  • 第三の選択肢は、単純にとにかく(:pseudocodeish警告)vectorをラップするのですか?あなたの質問は何ですか? – hyde

  • +1

    @hydeこれは '[](){foo(); bar();}'でしょうか? – Julian

    +0

    戻り値の型が* '*'ではない場合、あなたは何を期待しますか? – o11c

    答えて

    5

    std::functionターゲットの定義はconst T* target() constです。つまり、1つのtアゼット。

    This question has been asked beforeのように、イベントハンドラのコンテキストでは、CLR/.NETでは「デリゲートマルチキャスティング」と呼ばれています。

    いくつかの可能な解決策があります:

    1. は、最初は手動でマルチキャストを定義するためにラムダまたは他の機能を使用することです:

      function<void()> v = []() { 
          foo(); 
          bar(); 
      }; 
      v(); 
      
    2. 秒がフル独自に定義することです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(); 
      
    +0

    おそらく 'target'が値またはconst refであるようにしたいので、例えばlambdaにバインドすることができます –