模板特化中参数包的大小

Size of parameter pack in template specialization

我有一个模板,它为 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> 处终止递归,这些是特化的。前者很简单,但我无法弄清楚如何从 Payloads....
中的类型数中得出 MaxOrder 一个明显的解决方案是引入 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?

有什么建议吗?

我不确定我是否遇到了问题,但您仍然可以使用从您的实际实现继承的中间 class:

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