是否可以像这样重载函数模板(仅在使用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
除了模板参数之外的其他地方)?
默认参数在确定函数的唯一性方面不起任何作用。所以编译器看到的是您正在定义两个函数,例如:
template <class T, class>
void fn(T t) { }
template <class T, class>
void fn(T t) { }
这是重新定义相同的函数,因此会出现错误。相反,你可以做的是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) { }
现在我们有不同的签名,因此有不同的功能。 SFINAE 将按照预期从过载集中删除其中之一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)