模板特化中参数包的大小
Size of parameter pack in template specialization
本文关键字:参数 更新时间:2023-10-16
我有一个模板,它提供了从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…允许在模板参数中进行专门化吗?
有什么建议吗?
我不确定我有问题,但您仍然可以使用从实际实现继承的中间类:
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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用