C ++ SFINAE - std :: enable_if位置的差异 - 在模板中或作为回报

时间:2018-03-28 09:34:59

标签: 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_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); 
}

1 个答案:

答案 0 :(得分:3)

std::enable_if的默认第二个参数是void,因此表达式typename std::enable_if<std::is_integral<T>::value>::type = 0生成错误。

返回值为enable_if的情况不会为初始化程序引入不必要的模板参数,因此对于函数模板来说更优雅,更不容易出错。

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

另一方面,

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