带非类型模板参数的类模板推导指南实现方法咨询
如何实现基于整数奇偶性的Num类模板推导指南?
你提供的代码里,原推导指南的写法无法正常工作——问题出在模板参数int i没办法从构造函数的普通int参数推导出来,编译器没法把传入的数值(比如3)绑定到这个模板参数上。要实现从整数实参的奇偶性推导Num的模板参数even,可以用C++20引入的非类型模板参数的auto推导来实现,具体如下:
正确实现代码
#include <concepts> template<bool even> struct Num { const int i; }; // 推导指南:接受编译期整数常量,根据奇偶性推导even参数 template<std::integral auto i> Num(i) -> Num<(i % 2) == 0>; int main() { const Num a{3}; // 推导为Num<false>(3是奇数) const Num b{4}; // 推导为Num<true>(4是偶数) // 注意:如果传入的不是编译期常量,推导会失败,必须显式指定模板参数 // int x = 5; // Num c{x}; // 错误:x是运行时变量,无法推导模板参数 // Num<false> c{x}; // 正确写法 }
关键说明
- 推导指南的模板参数:用
std::integral auto i限定参数是整数类型的编译期常量,这样编译器能从传入的常量表达式(比如字面量3、4)推导出i的具体值。 - 模板参数计算:通过
(i % 2) == 0判断整数是否为偶数,将结果作为Num的模板参数even的值。 - 限制条件:只有当传入的实参是编译期常量时,这个推导才能生效。如果是运行时确定的变量,必须显式指定
Num的模板参数,因为模板参数必须在编译期确定。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

