2016-10-21 7 views
1

У меня есть шаблон, который предоставляет тип для любого заданного порядка в диапазоне от 0 до MaxOrder.Размер пакета параметров в специализации шаблона

template <class Graph, int Order> TypeHelper; 

Это необходимо потому, что TypeHelper<Graph, k> зависит от TypeHelper<Graph, 0>, TypeHelper<Graph, k - 1> и TypeHelper<Graph, k + 1>.

Graph является вариационным шаблоном, который служит в качестве контейнера для типа Payload для любого заданного порядка.

template <class... Payloads> Graph; 

Для того, чтобы прекратить рекурсию на TypeHelper<Graph, 0> и TypeHelper<Graph, MaxOrder> эти специализированные. Первый прямолинейный, но я не могу понять, как получить MaxOrder из числа типов в Payloads....
Одним из очевидных решений является введение MaxOrder в качестве параметра шаблона Graph.
В качестве примера:

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

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

Но я предпочел бы что-то вроде этого

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

Но это не работает.

Дальнейшее чтение: Is sizeof... allowed in template arguments for specialization?

Любые предложения?

+0

ли Вы хотите вывести 'Graph' в качестве параметра шаблона шаблона, или если это «Граф», который вы определили раньше? – krzaq

+0

График определен сначала и, следовательно, каждый тип полезной нагрузки. –

ответ

1

Я не уверен, что я получил эту проблему, но вы все еще можете использовать промежуточный класс, который наследуется от фактического осуществления:

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

Это всегда создавало 'TypeHelper ', но это указывает в правильном направлении. Заказ вашего решения - MaxOrder. При добавлении другого параметра Order для всех классов решает проблему. –