2013-05-28 13 views
9

我寫了這段代碼,它現在可以接受一個無效回調並將一個值傳遞給它。但是,有什麼方法可以讓用戶能夠設置多個參數?也許像Callback Caller這樣的東西;而不是定義多個類型名稱的回調?我能不能將這一切歸入一個類型名稱?有沒有反正我可以做一個模板<typename T>接受多個值?

例如,這裏是我的類

template <typename T> 
class Callback 
{ 
private: 
    std::vector<std::function <void (T)>> func; 
public: 
    virtual void operator += (std::function<void (T)> _func) 
    { 
     func.push_back(_func); 
    } 

}; 

我用這樣的:

Callback<int> Test; 

如果我想只有一個參數傳遞給我的功能,它工作得很好。但是,是否有可能讓用戶能夠定義多個值,而沒有多個typename?

I.e.

Callback< <(int, int, int)> > Test; 

類似的東西?

+1

值得一提的是,您可以在C++ 11中使用'emplace_back'而不是'push_back'來構建它。 – chris

回答

13

在C++ 11,使用可變參數模板:

template <typename... Ts> 
//    ^^^^^^ Parameter pack 
class Callback 
{ 
private: 
    std::vector<std::function <void (Ts...)>> func; 
//         ^^^^^ 
//         Parameter pack expansion 
public: 
    virtual void operator += (std::function<void (Ts...)> _func) 
//            ^^^^^ 
//        Parameter pack expansion    
    { 
     func.push_back(_func); 
    } 
}; 

現在你可以實例類是這樣的:

Callback<int, int, int> 
Callback<double, std::string> 
Callback<bool> 
Callback<> 
... 
+0

謝謝,完美的作品。我將閱讀有關包裝參數以瞭解更多信息。 – Jason

+0

@Jason:好的,很高興我能幫上忙。如果這回答你的問題,請考慮標記答案,當系統允許你接受:) –

1

沒有的C++ 0x,你可以使用boost::mpl::set先通過一組類型。 如果您需要參數的順序,請使用boost::mpl::vector

有關更多詳細信息,請參見http://www.boost.org

相關問題