模板参数上的C ++函数模板重载

时间:2016-04-30 17:57:41

标签: c++ templates overloading

是否可以像这样重载功能模板(仅使用enable_if在模板参数上):

template <class T, class = std::enable_if_t<std::is_arithmetic<T>::value>>
void fn(T t)
{

}
template <class T, class = std::enable_if_t<!std::is_arithmetic<T>::value>>
void fn(T t)
{

}

如果enable_if中的条件不重叠?我的MSVS编译器抱怨'void fn(T)' : function template has already been defined。如果没有,那么替代方案是什么(理想情况下不将enable_if放在模板参数之外的任何地方)?

1 个答案:

答案 0 :(得分:3)

默认参数在确定函数的唯一性方面不起作用。所以编译器看到的是你定义了两个函数,如:

enable_if

重新定义相同的功能,因此错误。你可以做的是让template <class T, std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> void fn(T t) { } template <class T, std::enable_if_t<!std::is_arithmetic<T>::value, int> = 0> void fn(T t) { } 本身成为模板非类型参数:

=IF( (IF(C2="Recruitment",1,0)+IF(D2="Secondment In",1,0)) > 0 , 1 , 0)

现在我们有不同的签名,因此功能不同。 SFINAE将负责按预期从过载设置中移除一个或另一个。