我有将不同的算术类型转换为半精度浮点类型的函数(只是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 错误)。那么为什么这不起作用,如何在尽可能少的编程开销和仅标准功能的限制(如果可能的话)的情况下使其工作?