模板函数使用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";
}

你可能感兴趣的:(C++,c++)