Templating hors d'une liste de longueur arbitraire de types en C ++
-
22-09-2019 - |
Question
Voici ce que je veux être en mesure de taper:
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 ne veux pas 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 comprendre comment stimuler le fait, mais cela semble être parce qu'il ya une couche de macros entre moi et modèles.
Comment pourrais-je aller à ce sujet? Je préfère pas pour faire la liste géante de modèles pour chaque nombre de types, mais si c'est le seul c'est la seule façon ...
Edit: je suis devenu assez certain qu'il n'y a aucun moyen de faire ce que je veux faire (presque, mais vous ne pouvez pas avoir un nombre variable d'arguments macro), mais la question continue de générer des réponses utiles et instructifs.
La solution
géant de modèles pour chaque nombre de types est la seule façon de le faire dans la version actuelle de C ++. Voir boost :: tuple pour un exemple de la façon de s'y prendre.
Autres conseils
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> { };