2016-04-15 148 views

回答

5

std::function對目標的定義是const T* target() const,這意味着它只能存儲一個t ARGET。

This question has been asked before,您所描述的情況在事件處理程序的上下文中稱爲CLR/.NET中的「委託多點傳送」。

有幾個可能的解決方案:

  1. 第一種方法是使用lambda或其他功能來定義手動組播:

    function<void()> v = []() { 
        foo(); 
        bar(); 
    }; 
    v(); 
    
  2. 第二是定義自己的全std::function -esque支持可變數量的目標。您可以使用template陣列(因此避免運行時使用vector),或者只是使用vector

  3. 第三種選擇是簡單地包裹vector反正(警告:pseudocodeish):

    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'是通過value或const ref引用的,因此它可以綁定到lambda表達式 –

相關問題