2008-09-30 45 views
5

我有一組回調類,用於處理具有可變數量參數的回調。現在我有大約6個不同的實例來處理不同數量的參數。有沒有辦法讓一個實例可以處理可變數量的參數?最終我很想讓每個參數都是POD類型或類指針或結構體指針。有任何想法嗎?有沒有辦法處理模板類中可變數量的參數?

template <class T> 
class kGUICallBackPtr 
{ 
public: 
    kGUICallBackPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *)); 
    inline void Call(T *i) {if(m_func) m_func(m_obj,i);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *); 
}; 


template <class T,class U> 
class kGUICallBackPtrPtr 
{ 
public: 
    kGUICallBackPtrPtr() {m_obj=0;m_func=0;} 
    void Set(void *o,void (*f)(void *,T *,U *)); 
    inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);} 
    inline bool IsValid(void) {return (m_func!=0);} 
private: 
    void *m_obj; 
    void (*m_func)(void *,T *,U *j); 
}; 

回答

0

如何通過使用Boost Bind迴避此問題?你可以讓你的代碼接受一個參數,或者根本不接受任何參數,並在呼叫站點綁定你需要的參數。

3

C++ 0x variatdic模板是你最好的選擇,但它也將是一段時間才能使用它們。

如果您今天需要序列類型,請查看MPL的vector類型以及其他類型的序列類型。它是Boost庫的一部分。它允許您提供一個類型序列的模板參數,而不僅僅是一種類型。

0

我的第一選擇是使用boost :: bind,boost :: function或std :: bind/std :: function和/或C++ 11 lambda來實現你的目標。但是如果你需要推出你自己的函數,那麼我會使用boost融合來創建一個採用單個模板參數的'融合函子'。

http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

最終所有這些庫的使用預處理器宏列舉所有可能的選項,以解決缺乏varidic模板。

相關問題