2008-09-30 8 views
5

Ich habe eine Reihe von Callback-Klassen, die ich für Callbacks mit variabler Anzahl von Parametern verwenden. Im Moment habe ich ungefähr 6 verschiedene Instanzen davon, um unterschiedliche Anzahlen von Argumenten zu behandeln. Gibt es eine Möglichkeit, eine Instanz zu erstellen, als mit einer variablen Anzahl von Argumenten umgehen zu können? Letztendlich würde ich gerne jeden Parameter als einen POD-Typ oder einen Klassenzeiger oder einen Strukturzeiger haben. Irgendwelche Ideen?Gibt es eine Möglichkeit, mit einer variablen Anzahl von Parametern in einer Vorlagenklasse umzugehen?

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); 
}; 

Antwort

0

Wie umgehen Sie dieses Problem durch die Verwendung von Boost Bind? Sie könnten Ihren Code dazu bringen, ein einzelnes Argument oder gar kein Argument zu akzeptieren und die Argumente, die Sie an der Aufrufsite benötigen, zu binden.

3

C++ 0x variatdic Vorlagen ist Ihre beste Wette, aber es wird auch eine Weile dauern, bevor Sie sie verwenden können.

Wenn Sie heute Sequenzen von Typen benötigen, werfen Sie einen Blick auf MPL vector von Typen, sowie andere Typen Sequenztypen. Es ist Teil der Boost Bibliothek. Sie können ein Vorlagenargument angeben, bei dem es sich um eine Abfolge von Typen anstelle eines einzelnen Typs handelt.

0

Meine erste Wahl wäre boost :: bind, boost :: function, oder std :: bind/std :: function und/oder C++ 11 Lambda's, um Ihr Ziel zu erreichen. Aber wenn Sie Ihren eigenen Funktor rollen müssen, würde ich Boost-Fusion verwenden, um einen "fusionierten Funktor" zu erstellen, der ein einzelnes Template-Argument benötigt.

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

Letztlich nutzen alle diese Bibliotheken Preprozessor Makros alle möglichen Optionen aufzuzählen um fehlende varidic Vorlagen zu arbeiten.