【ChatGPT教我编程】逐渐读懂模板

博客围绕C++函数模板展开,介绍了一个函数模板,使用模板元编程技巧限制仅整型可传入,还提到该模板未严格限制参数类型,可接受任意类型。同时指出一个代码错误,即函数模板中重复声明类型参数会导致编译失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新中…

三段代码

template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void print_if_integral(T value) {
    std::cout << value << std::endl;
}

这是一个函数模板,函数名为 print_if_integral,接受一个类型为 T 的参数 value,该函数会打印出传入的参数值,但仅当 T 是整型时才会打印。这里使用了 std::enable_if_tstd::is_integral_v 两个模板元编程的技巧,作用是限制只有整型类型才能被这个函数接受。

具体来说,std::is_integral_v<T> 用于判断类型 T 是否为整型类型,返回值是一个 bool 值,如果是整型类型则返回 true,否则返回 false。如果返回值为 true,则 std::enable_if_t<std::is_integral_v<T>> 的结果是 T 类型本身,即 typename = T,否则 std::enable_if_t<std::is_integral_v<T>> 无法通过编译。最终的效果是,在调用 print_if_integral 函数时,如果传入的参数是非整型类型,则编译器会报错,从而避免了程序运行时的错误。

template <typename T, typename = T>
void print_if_integral(T value) {
    std::cout << value << std::endl;
}

这个函数模板并没有限制它所接受的参数必须是整数类型,因为第二个模板参数的默认类型是T本身。所以这个函数可以接受任何类型的参数,且函数体中对参数的输出方式也没有做特别的处理。如果传入的是一个整数类型,则会以整数形式输出;否则会以默认的方式输出。

如果想限制函数参数为整数类型,可以使用std::enable_if结合std::is_integral类型特征进行限制,具体可参考之前提供的示例代码。

template <typename T, typename T>
void print_if_integral(T value) {
    std::cout << value << std::endl;
}

这个代码是错误的,因为它在函数模板中重复声明了类型参数 T。在函数模板的参数列表中,每个参数必须有独一无二的名字,否则代码会无法通过编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值