我有将不同算术类型转换为半精度浮点类型的函数(只是一个uint16_t
在最低级别),我对整数和浮点源类型有不同的函数,使用 SFINAE 和std::enable_if
:
template<typename T>
uint16_t to_half(typename std::enable_if<
std::is_floating_point<T>::value,T>::type value)
{
//float to half conversion
}
template<typename T>
uint16_t to_half(typename std::enable_if<
std::is_integral<T>::value,T>::type value)
{
//int to half conversion
}
这些是通过显式实例化从通用模板化构造函数内部调用的:
template<typename T>
half::half(T rhs)
: data_(detail::conversion::to_half<T>(rhs))
{
}
这可以编译并且工作得很好。现在我尝试通过用两个函数替换第二个函数来区分有符号整数和无符号整数:
template<typename T>
uint16_t to_half(typename std::enable_if<std::is_integral<T>::value &&
std::is_signed<T>::value,T>::type value)
{
//signed to half conversion
}
template<typename T>
uint16_t to_half(typename std::enable_if<std::is_integral<T>::value &&
std::is_unsigned<T>::value,T>::type value)
{
//unsigned to half conversion
}
但是一旦我尝试编译这个 VS2010 给了我
错误 C2995:"uint16_t math::detail::conversion::to_half( std::enable_if<std::tr1::is_integral<_Ty>::value && std::tr1::is_signed<_Ty>::value, T>::type )"
: 函数模板已经定义。
因此,它似乎无法消除两个模板之间的歧义,但显然积分版本和浮点版本没有问题。
但由于我不是一个模板魔术师,我可能只是在这里遗漏了一些明显的东西(或者也许它实际上应该工作并且只是 VS2010 的一个错误)。那么,为什么这不起作用?如何才能以尽可能少的编程开销并在仅限标准功能的限制内(如果可能的话)工作?