模板专用中参数包的大小

时间:2016-10-21 08:57:14

标签: c++ templates metaprogramming circular-dependency

我有一个模板,可以为0MaxOrder范围内的任何订单提供类型。

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?

有什么建议吗?

1 个答案:

答案 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)> {};