2016-10-21 1 views
1

Ich habe eine Vorlage, die einen Typ für jede gegebene Bestellung im Bereich von 0 bis MaxOrder bereitstellt.Größe des Parameterpakets in Template-Spezialisierung

template <class Graph, int Order> TypeHelper; 

Dies ist notwendig, weil TypeHelper<Graph, k> auf TypeHelper<Graph, 0> abhängt, TypeHelper<Graph, k - 1> und TypeHelper<Graph, k + 1>.

Graph ist eine variadische Vorlage, die als Container für den Typ Payload für eine beliebige Reihenfolge dient.

template <class... Payloads> Graph; 

Um Fach die Rekursion bei TypeHelper<Graph, 0> und TypeHelper<Graph, MaxOrder> diese zu beenden. Ersteres ist einfach, aber ich kann nicht herausfinden, wie man MaxOrder aus der Anzahl der Typen in Payloads... ableiten kann.
Eine naheliegende Lösung ist die Einführung von MaxOrder als Vorlageparameter von Graph.
Als Beispiel:

template <int MaxOrder, class... Payloads> Graph; 

template <template <int, class...> class Graph, int MaxOrder, class... Payloads> 
struct TypeHelper<Graph<MaxOrder, Payloads...>, MaxOrder> 

Aber ich würde so etwas wie diese

template <template <class...> class Graph, class... Payloads> 
struct TypeHelper<Graph<Payloads...>, sizeof...(Payloads)> 

Aber das funktioniert nicht bevorzugen.

Weiterführende Literatur: Is sizeof... allowed in template arguments for specialization?

Irgendwelche Vorschläge?

+0

Haben Sie 'Graph' als Template-Template-Parameter ableiten wollen, oder sollte Ist es der 'Graph', den Sie vorher definiert haben? – krzaq

+0

Graph wird zuerst definiert und damit jeder Payload-Typ. –

Antwort

1

Ich bin mir nicht sicher, ob ich das Problem hätte, aber man kann immer noch eine Zwischenklasse verwenden, die von Ihrer tatsächlichen Implementierung erbt:

template <class Graph, int Order> 
struct TypeHelperImpl; 

// specializations of TypeHelperImpl 

template <typename...> 
struct TypeHelper; 

template <template <class...> class Graph, class... Payloads> 
struct TypeHelper<Graph<Payloads...>, Payloads...> 
    : TypeHelperImpl<Graph<Payloads...>, sizeof...(Payloads)> {}; 
+0

Dies würde immer 'TypeHelper ' erzeugen, aber dies zeigt in die richtige Richtung. Die Reihenfolge Ihrer Lösung ist MaxOrder. Das Hinzufügen eines anderen Parameters Order zu allen Klassen löst das Problem. –