Gibt es eine Möglichkeit, eine variable Anzahl von Parametern in einer Template-Klasse zu behandeln?

StackOverflow https://stackoverflow.com/questions/154780

Frage

Ich habe eine Reihe von Callback-Klassen, die ich Rückrufe mit einer variablen Anzahl von Parametern Handhabung verwenden für. Im Moment habe ich über 6 verschiedene Instanzen davon eine unterschiedliche Anzahl von Argumenten zu behandeln. Gibt es eine Möglichkeit eine Instanz zu machen, als eine variable Anzahl von Argumenten umgehen kann ?? Letztendlich würde ich gerne jeden Parameter ein POD-Typ oder ein Klassenzeiger oder ein Struct Zeiger haben. Irgendwelche Ideen?

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);
};
War es hilfreich?

Lösung

Noch nicht in der Sprache selbst, sondern C ++ 0x für variadische Vorlagen .

Andere Tipps

C ++ 0x variatdic Vorlagen ist die beste Wahl, aber es wird auch eine Weile dauern, bis Sie sie verwenden können.

Wenn Sie Sequenzen von Arten heute brauchen, werfen Sie einen Blick auf MPL der vector der Typen sowie andere Art Sequenztypen. Es ist ein Teil des Bibliothek steigern. Es ermöglicht Ihnen, eine Vorlage Argument zu schaffen, die eine Folge von Datentypen ist, statt nur eine einzige Art.

Wie wäre es dieses Problem durch die Verwendung von Boost-Bind ? Sie könnten Ihren Code akzeptiert ein einziges Argument, oder gar nicht machen, und binden Argumente, die Sie an der Aufrufstelle benötigen.

Meine erste Wahl wäre boost :: bind zu verwenden, boost :: Funktion oder std :: bind / std :: Funktion und / oder C ++ 11 Lambda ist Ihr Ziel zu erreichen. Aber wenn Sie benötigen, um Ihre eigene Funktors rollen, dann würde ich Boost-Fusion verwenden, um eine ‚fusioniert Funktors‘ zu schaffen, die eine einzige Vorlage Argument.

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

Schließlich verwenden alle diese Bibliotheken Preprozessor Makros alle möglichen Optionen aufzuzählen um fehlende varidic Vorlagen zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top