我有一个模板,可以为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 :(得分: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)> {};