这两个实现有什么区别,我应该使用哪些,因为如果我从main调用它们,那么两者的工作方式相同:
template<class T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void test( const T& t ){
printf("int\n");
}
template<class T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>
void test( const T& t ){
printf("float\n");
}
VS
template<class T>
typename std::enable_if<std::is_integral<T>::value>::type test1( const T& t ){
printf("int\n");
}
template<class T>
typename std::enable_if<std::is_floating_point<T>::value>::type test1( const T& t ){
printf("float\n");
}
和主要:
int main(){
test(1);
test(1.0);
test1(1);
test1(1.0);
}
答案 0 :(得分:3)
std::enable_if
的默认第二个参数是void
,因此表达式typename std::enable_if<std::is_integral<T>::value>::type = 0
生成错误。
返回值为enable_if
的情况不会为初始化程序引入不必要的模板参数,因此对于函数模板来说更优雅,更不容易出错。
正如您所注意到的那样,在引入不必要的模板参数时更容易出错。
另一方面,类模板必须使用SFINAE的额外模板参数,因为没有返回值。