C++ C++;SFINAE-std::enable_的差异,如果位置-在模板中或作为返回

C++ C++;SFINAE-std::enable_的差异,如果位置-在模板中或作为返回,c++,sfinae,C++,Sfinae,这两种实现的区别是什么?我应该使用哪种实现,因为如果我从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_i

这两种实现的区别是什么?我应该使用哪种实现,因为如果我从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");
}

std::enable_if
的默认第二个参数是
void
,因此表达式
typename std::enable_if::type=0
格式不正确


返回值的
enable\u if
不会引入不必要的带有初始值设定项的模板参数,因此函数模板更优雅,更不容易出错

正如您所注意到的,在引入不必要的模板参数时更容易出错


另一方面,类模板必须为SFINAE使用额外的模板参数,因为没有返回值。

在这种情况下没有实际区别。第二种形式是兼容的pre-C++11。第一个可用于构造函数,并且具有更简单的函数签名(如果您想创建函数指针)。@Jarod42-Ho-yeah!是的。很抱歉,我有一个拼写错误,我更喜欢一个答案,说两者都是合法的,行为相似(这回答了问题),两者之间的选择是一个简单的偏好,你的选择是后者,因为原因(让你给出你的意见)。对于第一个示例,如果我将签名更改为:
typename std::enable_If::type*=nullptr
,我可以在第二个
enable_If
参数中使用
void
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); 
}