2016-06-14 51 views
0

的所以,我有一類稱爲代表能夠存儲函數指針陣列。這是代碼:陣列的函數指針(包括成員函數)投擲模板特錯誤

template<typename Func> 
class delegate 
{ 
private: 
public: 
    typename std::vector<Func> mListOfFunctions; 
    void Bind(Func f) 
    { 
     mListOfFunctions.push_back(f); 
    } 
    template<typename...TArgs> 
    void Invoke(TArgs&&...arg) 
    { 
     for (auto f : mListOfFunctions) 
     { 
      f(std::forward<TArgs>(arg)...); 
     } 
    } 
}; 

用法在Player.cpp:

delegate<void(float)> testDelegate; 
testDelegate.Bind(std::bind(&Player::MoveLeft,this)); 

這引發錯誤C2893(錯誤C2893無法專注函數模板「未知類型的std ::調用(_Callable & & ,_types & & ...)「)

但是,當我更改綁定的定義如下:

template<typename F>  
void Bind(F f) 
    { 

    } 

它工作正常,但是當我試圖函數對象推到載體中再次拋出了同樣的錯誤。 無論如何要解決這個問題嗎?我需要緩存通過的指針

回答

0

std::bind的結果不是一個函數指針(它是一個未指定類型的函數對象),但你試圖將它合併爲一個。由於您使用的std::forward,您必須使用C++ 11,這意味着你可以使用std::function

template<typename Func> 
class delegate 
{ 
private: 
public: 
    typename std::vector<std::function<Func>> mListOfFunctions; 
    void Bind(std::function<Func> f) 
    { 
     mListOfFunctions.push_back(f); 
    } 
    template<typename...TArgs> 
    void Invoke(TArgs&&...arg) 
    { 
     for (auto f : mListOfFunctions) 
     { 
      f(std::forward<TArgs>(arg)...); 
     } 
    } 
}; 
+0

我改成了下面的,它仍然拋出一個錯誤:無效綁定(標準::功能<返回類型(TArgs ...)> F) \t { \t \t mListOfFunctions.push_back(F); \t} –

+0

爲什麼要那樣做?爲什麼你不使用我發佈的代碼? –

+0

我這樣做太:模板 類委託 { 私人: 市民: \t類型名稱的std ::向量<性病::功能> mListOfFunctions; \t空隙綁定(標準::函數 F) \t { \t \t mListOfFunctions.push_back(F); \t} \t模板<類型名... TArgs> \t空隙調用(TArgs && ... ARG) \t { \t \t爲(自動F:mListOfFunctions) \t \t { \t \t \t F(標準::轉發(arg)...); \t \t} \t} };但是當我調用綁定時,它會再次拋出錯誤 –