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

Ale*_*ily 5 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)
{

}
Run Code Online (Sandbox Code Playgroud)

如果条件enable_if不重叠?我的 MSVS 编译器抱怨说'void fn(T)' : function template has already been defined. 如果没有,有什么替代方法(理想情况下不要将enable_if其他任何地方放入模板参数中)?

Bar*_*rry 4

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

template <class T, class>
void fn(T t) { }

template <class T, class>
void fn(T t) { }
Run Code Online (Sandbox Code Playgroud)

这是重新定义相同的函数,因此会出现错误。您可以做的是将其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) { }
Run Code Online (Sandbox Code Playgroud)

现在我们有不同的签名,因此有不同的功能。SFINAE 将按照预期从过载集中删除其中之一。