我有一个模板,它为 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?
有什么建议吗?
最佳答案
我不确定我是否遇到了问题,但您仍然可以使用从您的实际实现继承的中间类:
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)> {};
关于c++ - 模板特化中参数包的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172361/