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 值。