I have a template that provides a type for any given Order in the range from 0 to MaxOrder.
template <class Graph, int Order> TypeHelper;
This is necessary because TypeHelper<Graph, k> depends on TypeHelper<Graph, 0>, TypeHelper<Graph, k - 1> and TypeHelper<Graph, k + 1>.
Graph is a variadic template that serves as a container for the type of the Payload for any given order.
template <class... Payloads> Graph;
In order to terminate the recursion at TypeHelper<Graph, 0> and TypeHelper<Graph, MaxOrder> these are specialized. The former is straight forward but I cannot figure out how to derive MaxOrder from the number of types in Payloads....
One obvious solution is to introduce MaxOrder as a template parameter of Graph.
As an example:
template <int MaxOrder, class... Payloads> Graph;
template <template <int, class...> class Graph, int MaxOrder, class... Payloads>
struct TypeHelper<Graph<MaxOrder, Payloads...>, MaxOrder>
But I would prefer something like this
template <template <class...> class Graph, class... Payloads>
struct TypeHelper<Graph<Payloads...>, sizeof...(Payloads)>
But this does not work.
Further reading: Is sizeof... allowed in template arguments for specialization?
Any suggestions?