if constexpr提供了编译期的选择,编译器会只保留符合条件的代码,而把不符合部分去掉:
#include <iostream>
#include <string>
using namespace std;
template<class T>
void f(T t)
{
if (is_same<T, int>::value)
{
t = 8;
}
else if (is_same<T, string>::value)
{
t = "hello";
}
cout<<t<<endl;
}
int main()
{
f(5);
f("hi"s);
return 0;
}
编译程序会报错:invalid conversion from 'const char*' to 'int'
这是因为编译期会对类型进行检查造成的
可以通过if constexpr进行编译器的选择:
#include <iostream>
#include <string>
using namespace std;
template<class T>
void f(T t)
{
if constexpr(is_same<T, int>::value)
{
t = 8;
}
else if constexpr(is_same<T, string>::value)
{
t = "hello";
}
cout<<t<<endl;
}
int main()
{
f(5);
f("hi"s);
return 0;
}
运行程序输出:
8
hello