Question

J'ai un ensemble de classes de rappel que j'utilise pour gérer les rappels avec un nombre variable de paramètres. À l'heure actuelle, j'ai environ 6 instances différentes pour gérer des nombres d'arguments différents. Y at-il un moyen de faire une instance qui peut gérer un nombre variable d'arguments? En fin de compte, j'aimerais que chaque paramètre soit un type de POD, un pointeur de classe ou un pointeur struct. Des idées?

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);
};
Était-ce utile?

La solution

Pas encore dans le langage lui-même, mais C ++ 0x sera compatible avec modèles variadiques .

Autres conseils

Les modèles variés C ++ 0x sont votre meilleur choix, mais il faudra encore un certain temps avant de pouvoir les utiliser.

Si vous avez besoin de séquences de types aujourd'hui, jetez un coup d'oeil aux MPL vecteur de types, ainsi que d'autres types de séquence de types. Cela fait partie de la bibliothèque Boost . Il vous permet de fournir un argument de modèle qui est une séquence de types, au lieu d’un seul type.

Pourquoi éviter ce problème en utilisant Boost Bind ? Vous pouvez faire accepter par votre code un seul argument, voire aucun, et lier les arguments dont vous avez besoin sur le site d’appel.

Mon premier choix serait d’utiliser boost :: bind, boost :: function ou std :: bind / std :: function et / ou c ++ 11 lambda pour atteindre votre objectif. Mais si vous avez besoin de lancer votre propre foncteur, j'utiliserais alors la fusion renforcée pour créer un «foncteur fusionné» qui prend un seul argument de modèle.

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

En fin de compte, toutes ces bibliothèques utilisent des macros de préprocesseur pour énumérer toutes les options possibles permettant de contourner le manque de modèles varidic.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top