gpt4 book ai didi

c++ - 有符号和无符号之间的 SFINAE 区别

转载 作者:可可西里 更新时间:2023-11-01 17:37:22 32 4
gpt4 key购买 nike

我有将不同算术类型转换为半精度浮点类型的函数(在最低级别上只有一个 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 给我

error 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 )": function template already defined.

所以它似乎无法消除两个模板之间的歧义,但显然整数版本和浮点版本没有问题。

但由于我不是一个模板魔术师,所以我可能只是在这里遗漏了一些明显的东西(或者它实际上应该可以工作并且只是一个 VS2010 错误)。那么,为什么这行不通,如何才能在尽可能少的编程开销和仅标准功能的限制(如果可能的话)的情况下使其工作?

最佳答案

就个人而言,我会尽可能避免在这里使用 SFINAE,因为您可以通过重载完成同样的事情:

template<typename T>
uint16_t to_half_impl(T val, std::true_type, std::true_type)
{
// is_integral + is_signed implementation
}

template<typename T>
uint16_t to_half_impl(T val, std::true_type, std::false_type)
{
// is_integral + is_unsigned implementation
}

template<typename T>
uint16_t to_half_impl(T val, std::false_type, std::true_type)
{
// is_floating_point implementation
}

template<typename T>
typename std::enable_if<std::is_arithmetic<T>::value, uint16_t>::type to_half(T val)
{
return to_half_impl(val, std::is_integral<T>(), std::is_signed<T>());
}

关于c++ - 有符号和无符号之间的 SFINAE 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285657/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com