c++ - 模板特化中参数包的大小

标签 c++ templates metaprogramming circular-dependency

我有一个模板,它为 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/

相关文章:

c++ - 没有 new 的动态数组 (C++)

c++ - 传递给模板函数时,lambda 自动衰减为函数指针

python - Flask 模板扩展问题

c++ - 编译器在模板类中实例化函数,甚至不调用它

Python 和 Smalltalk - 元编程能力比较

c++ - 正确的继承/类结构

c++ - GotW #35 中关于 typename 的 Herb Sutter 代码笑话是否已过时?

c++ - 错误 LNK2019 : unresolved external symbol "public: __thiscall

c++ - 实现快速模板数组重置方法

ruby - class << self 是什么意思?