Domanda

Ho una serie di classi di callback che uso per gestire callback con un numero variabile di parametri. In questo momento ho circa 6 diversi casi per gestire diversi numeri di argomenti. C'è un modo per creare un'istanza che può gestire un numero variabile di argomenti ?? In definitiva, mi piacerebbe che ogni parametro fosse un tipo POD o un puntatore di classe o un puntatore a struttura. Qualche idea?

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);
};
È stato utile?

Soluzione

Non ancora nella stessa lingua ma C ++ 0x avrà il supporto per modelli variadici .

Altri suggerimenti

I modelli variatdic C ++ 0x sono la soluzione migliore, ma ci vorrà anche un po 'prima di poterli usare.

Se hai bisogno di sequenze di tipi oggi, dai un'occhiata a MPL's vettore di tipi, nonché altri tipi di sequenza di tipi. Fa parte della libreria Boost . Ti consente di fornire un argomento modello che è una sequenza di tipi, anziché solo un singolo tipo.

Che ne dite di eludere questo problema attraverso l'uso di Boost Bind ? Puoi fare in modo che il tuo codice accetti un singolo argomento, o nessuno, e associare gli argomenti che ti servono sul sito di chiamata.

La mia prima scelta sarebbe quella di usare boost :: bind, boost :: function o std :: bind / std :: function e / o c ++ 11 lambda per raggiungere il tuo obiettivo. Ma se hai bisogno di creare il tuo proprio funzione, allora userei boost fusion per creare un 'funzione fusa' che accetta un singolo argomento template.

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

Alla fine tutte queste librerie usano macro pre-processore per elencare tutte le possibili opzioni per aggirare la mancanza di modelli varidici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top