C++ SFINAE - std::enable_if 位置的差异 - 在模板或 return 中
C++ SFINAE - difference of std::enable_if position - in template or in return
这两个实现有什么区别,我应该使用它们中的哪一个,因为如果我从 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");
}
对
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);
}
std::enable_if
的默认第二个参数是 void
,因此表达式 typename std::enable_if<std::is_integral<T>::value>::type = 0
格式错误。
对于 return 值 enable_if
的情况不会引入带有初始值设定项的不必要的模板参数,因此对于函数模板来说更优雅,更少 error-prone。
如您所见,引入不必要的模板参数时更容易出错。
另一方面,Class 模板必须为 SFINAE 使用额外的模板参数,因为没有 return 值。
这两个实现有什么区别,我应该使用它们中的哪一个,因为如果我从 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");
}
对
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);
}
std::enable_if
的默认第二个参数是 void
,因此表达式 typename std::enable_if<std::is_integral<T>::value>::type = 0
格式错误。
对于 return 值 enable_if
的情况不会引入带有初始值设定项的不必要的模板参数,因此对于函数模板来说更优雅,更少 error-prone。
如您所见,引入不必要的模板参数时更容易出错。
另一方面,Class 模板必须为 SFINAE 使用额外的模板参数,因为没有 return 值。