Templating aus einer beliebigen Länge Liste von Typen in C ++
-
22-09-2019 - |
Frage
Hier ist, was ich will geben können:
class foo : public watchKeys<A, B, C> {}; //Or any list of keys
boost :: mpl hat Sequenzen, die Ihnen erlauben, dies zu tun, aber ich will nicht zu tun haben:
class foo : public watchKeys<mpl::list<A, B, C> > {};
ich nichts dagegen „hässlich“ oder verbose auf der Innenseite, aber ich möchte, dass die Art und Weise watchKeys letztlich sehr einfach zu verwenden ist und intuitiv. Ich kann auch nicht herausfinden, wie boost es tut, aber das scheint zu sein, weil es eine Schicht von Makros zwischen mir und Vorlagen.
Wie kann ich über diese gehen? Ich würde es vorziehen, nicht die riesige Liste von Vorlagen für jede Anzahl von Typen zu tun, aber wenn das das einzige ist, ist es der einzige Weg, ...
Edit: Ich habe ziemlich sicher geworden, dass es keine Möglichkeit zu tun, was ich tun will (fast, aber man kann nicht eine variable Anzahl von Makro-Argumente haben), aber die Frage noch nützliche und informative Antworten generiert.
Lösung
Die Riesen-Liste der Vorlagen für jede Anzahl von Typen ist der einzige Weg, um es in der aktuellen Version von C ++ zu tun. Siehe boost :: tuple für ein Beispiel, wie etwa zu gehen.
C ++ 0X unterstützt
Andere Tipps
Alternativ können Sie es rekursiv tun
template<typename Head, typename Tail>
struct list { };
struct emptylist { };
class foo : public watchKeys<list<A,
list<B,
list<C, emptylist> > > > { };
Sie können es dann verarbeiten wie diese
template<typename List>
struct process;
template<typename Head, typename Tail>
struct process< list<Head, Tail> > : process<Tail> {
// process Head
};
template<>
struct process<emptylist> { };