Er det en måte å håndtere et variabelt antall parametre i en mal klasse?

stemmer
5

Jeg har et sett av tilbakeringings klasser som jeg benytte til håndtering tilbakeanrop med varierende antall parametere. Akkurat nå har jeg ca 6 forskjellige tilfeller av det å håndtere forskjellige antall argumenter. Er det en måte å gjøre et tilfelle enn det som kan håndtere et variabelt antall argumenter ?? Til slutt jeg vil gjerne ha hver parameter være en POD type eller en klasse peker, eller en struct peker. Noen ideer?

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);
};
Publisert på 30/09/2008 klokken 20:10
kilden bruker
På andre språk...                            


4 svar

stemmer
5

Ikke ennå i språket vil i seg selv, men C ++ 0x har støtte for variadic maler .

Svarte 30/09/2008 kl. 20:18
kilden bruker

stemmer
0

Hva med sidestepping dette problemet gjennom bruk av Boost Bind ? Du kan gjøre koden godta et enkelt argument, eller ingen i det hele tatt, og binde argumenter du trenger på samtalen nettstedet.

Svarte 01/10/2008 kl. 00:07
kilden bruker

stemmer
3

C ++ 0x variatdic maler er det beste alternativet, men det vil også være en stund før du kan bruke dem.

Hvis du trenger sekvenser av typer i dag, ta en titt på MPL er vektor typer, samt andre typen sekvenstyper. Det er en del av Boost biblioteket. Den lar deg gi en mal argument som er en sekvens av typer, i stedet for bare en enkelt type.

Svarte 01/10/2008 kl. 05:55
kilden bruker

stemmer
0

Mitt første valg ville være å bruke boost :: bind, øke :: funksjon, eller std :: bind / std :: funksjon og / eller c ++ 11 lambda er å nå dine mål. Men hvis du trenger å rulle din egen funktor så ville jeg bruke boost fusjon for å skape en 'smeltet funktor' som tar en enkelt mal argument.

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

Til syvende og sist alle disse bibliotekene bruker pre-prosessor makroer for å nummerere alle mulige alternativer for å omgå mangel på varidic maler.

Svarte 02/08/2012 kl. 04:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more