首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定数值类型A是否可以转换为数值类型B

确定数值类型A是否可以转换为数值类型B
EN

Stack Overflow用户
提问于 2012-09-24 22:42:00
回答 1查看 190关注 0票数 6

给定两个数值类型FromTo。以下代码是否实际确定是否可以将任何From类型的值表示为To类型的值,而不会丢失信息?如果是,是否有更短或更具可读性的方法来确定?

代码语言:javascript
复制
template <class From, class To>
struct can_cast
{
    static const bool value = 
        (std::numeric_limits<From>::is_integer || // either From is an integer type OR 
        std::is_floating_point<To>::value) && // ...they're both floating point types AND
        (std::numeric_limits<From>::is_signed == false || // either From is unsigned OR
        std::numeric_limits<To>::is_signed == true) && // ...they're both signed AND
        (std::numeric_limits<From>::digits < std::numeric_limits<To>::digits || // To has more bits for digits than From OR
        std::numeric_limits<From>::digits == std::numeric_limits<To>::digits && // To and From have same number of bits, but
        std::numeric_limits<From>::is_signed == std::numeric_limits<To>::is_signed); // they're either both signed or both unsigned.
};
EN

回答 1

Stack Overflow用户

发布于 2012-09-24 22:53:31

编译器现在内置了这个功能:当使用列表初始化时,不允许缩小转换。

您可以在To { std::declval<From>() }的基础上编写传统的表达式测试器特征,并可能使用std::is_integralstd::is_floating_point添加其他检查。

代码语言:javascript
复制
template <typename T>
struct sfinae_true : std::true_type {};

struct can_cast_tester {
   template <typename From, typename To>
   sfinae_true<decltype(To { std::declval<From>() })> static test(int);
   template <typename...>
   std::false_type static test(...);
}; 

template <typename From, typename To>
struct can_cast // terrible name
: decltype(can_cast_tester::test<From, To>(0)) {};

从理论上讲,这应该是可行的,但目前看来,无论是GCC还是clang都没有做对。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12567335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档