You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带非类型模板参数的类模板推导指南实现方法咨询

如何实现基于整数奇偶性的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}; // 正确写法
}

关键说明

  1. 推导指南的模板参数:用std::integral auto i限定参数是整数类型的编译期常量,这样编译器能从传入的常量表达式(比如字面量3、4)推导出i的具体值。
  2. 模板参数计算:通过(i % 2) == 0判断整数是否为偶数,将结果作为Num的模板参数even的值。
  3. 限制条件:只有当传入的实参是编译期常量时,这个推导才能生效。如果是运行时确定的变量,必须显式指定Num的模板参数,因为模板参数必须在编译期确定。

内容的提问来源于stack exchange,提问作者Seb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:25:12