模板特化中参数包的大小

Size of parameter pack in template specialization

本文关键字:参数      更新时间:2023-10-16

我有一个模板,它提供了从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…允许在模板参数中进行专门化吗?

有什么建议吗?

我不确定我有问题,但您仍然可以使用从实际实现继承的中间类:

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