2010-02-24 17 views
2

Voici ce que je veux être en mesure de taper:Templating hors d'une liste de longueur arbitirary des types en C++

class foo : public watchKeys<A, B, C> {}; //Or any list of keys 

Boost :: mpl a des séquences, qui vous permettent de le faire, mais je n » t veulent avoir à faire:

class foo : public watchKeys<mpl::list<A, B, C> > {}; 

Je ne me dérange pas d'être « laid » ou bavard à l'intérieur, mais je veux les watchKeys façon est finalement utilisé pour être très simple et intuitive. Je ne peux pas non plus comprendre comment boost le fait, mais ça semble être parce qu'il y a une couche de macros entre moi et les templates.

Comment puis-je faire à ce sujet? Je préférerais pas pour faire la liste géante des modèles pour chaque nombre de types, mais si c'est le seul c'est la seule façon ...

Editer: Je suis devenu assez certain qu'il n'y a pas moyen de faire ce que je veux faire (presque, mais vous ne pouvez pas avoir un nombre variable d'arguments macro), mais la question génère toujours des réponses utiles et informatives.

Répondre

1

La liste géante de modèles pour chaque nombre de types est le seul moyen de le faire dans la version actuelle de C++. Voir boost :: tuple pour un exemple de comment s'y prendre.

C++0X prend en charge variadic templates, mais ce n'est pas encore bien pris en charge (je pense que la version moderne de GCC a un support expérimental cependant).

+0

* Boost.Preprocessor * est utilisé pour des choses fortement dans Boost, est une question de goût bien . Voir par exemple 'BOOST_PP_REPEAT' là: http://www.boost.org/doc/libs/1_42_0/libs/preprocessor/doc/index.html –

+0

Dans ma version de boost (1.38, un an) Boost.Preprocessor n'est pas utilisé pour cela dans boost :: tuple –

+0

Je n'ai pas regardé 'tuple' de façon explicite, mais si jamais vous passez par 'Boost.Function' vous devriez voir ça. –

0

Sinon, vous pouvez le faire récursive

template<typename Head, typename Tail> 
struct list { }; 

struct emptylist { }; 

class foo : public watchKeys<list<A, 
          list<B, 
          list<C, emptylist> > > > { }; 

Vous pouvez ensuite traiter comme ça

template<typename List> 
struct process; 

template<typename Head, typename Tail> 
struct process< list<Head, Tail> > : process<Tail> { 
    // process Head 
}; 

template<> 
struct process<emptylist> { }; 
+0

Tandis que spiffy (et un exemple pratique pour la métaprogrammation de modèle) partie de la solution désirée est un cas d'utilisation élégant, ce qui ne correspond pas. – Narfanator

+0

@Narfanator, je suis désolé, je ne comprends pas votre commentaire. Voulez-vous dire la syntaxe de 'list >' n'est pas la solution désirée? –

+0

Oui, exactement. Il est beaucoup plus intuitif de le faire à votre façon, mais c'est plus bavard sans ajouter de clarté. – Narfanator