更新中…
三段代码
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_t
和 std::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
。在函数模板的参数列表中,每个参数必须有独一无二的名字,否则代码会无法通过编译。