模板特化中参数包的大小
Size of parameter pack in template specialization
我有一个模板,它为 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>
处终止递归,这些是特化的。前者很简单,但我无法弄清楚如何从 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)> {};
我有一个模板,它为 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>
处终止递归,这些是特化的。前者很简单,但我无法弄清楚如何从 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)> {};