模板函数使用is_same的注意事项
在模板函数中使用is_same判断类型的话,编译器会实例化所有路径,即使某些路径在运行时不会被执行。
这意味着编译器会检查所有的分支,确保它们都是有效的。
例如如果存在从string转为int的路径,即便T为string时不会进入该路径,依旧会编译失败。
template<class T>
void f()
{
if (is_same<T, int>::value)
{
T a = 1;
}
else
{
T s = "23"; // error C2440: “初始化”: 无法从“const char [3]”转换为“int”
}
}
int main()
{
f<int>();
system("pause");
}
解决方法:
1、如果是 C++17 ,则可以使用 if constexpr 来让编译器只编译那些在编译时确定为 true 的分支,
它允许编译器在编译期评估条件表达式,并且只编译满足条件的分支。这可以避免不必要的代码路径被编译,从而防止类似错误的发生。
template<class T>
void f()
{
if constexpr (is_same<T, int>::value) // C++17特性
{
T a = 1;
}
else
{
T s = "23";
}
}
2、如果不支持C++17,就只能定义多个模板或模板特化了
template<class T>
void f()
{
T a = 1;
}
template<>
void f<string>()
{
string s = "23";
}

浙公网安备 33010602011771号