不同数值类型的相同比较

Posted

技术标签:

【中文标题】不同数值类型的相同比较【英文标题】:same comparison of different numeric types 【发布时间】:2019-07-09 07:37:28 【问题描述】:

我想比较几种数字类型的两种变体。

#include <cstdint>
#include <variant>

using Value = std::variant< uint64_t, int64_t, bool, float, double>;

bool compare(Value l, Value r)
    return std::visit([](auto v1,auto v2)return v1<v2;,l,r);

https://godbolt.org/z/ULCfVk

但是,在 msvc 上,这会导致警告。

这样安全吗? (又名在所有情况下都给出了预期的结果)

如果不是,如何安全完成?

【问题讨论】:

【参考方案1】:

这样安全吗?

取决于您认为“安全”的内容。您的代码不涉及未定义的行为或此类事情,但它肯定会导致意想不到的结果。示例:

Value v1 = std::int64_tstd::numeric_limits<std::int64_t>::min();
Value v2 = std::uint64_t42;

// Isn't v1 < v2? This assertion will fire...
assert(compare(v1, v2));

这里的问题是,您的包罗万象的访问者(通用 lambda)不会区分类型,并且会愉快地将有符号整数值与无符号整数值进行比较。前者转换为后者,产生较大的值,比较返回true。

如果不是,如何安全完成?

您可以向访问者函数对象添加额外的重载。看看overloaded 机械here。这样,只要比较需要它做正确的事情(即返回预期的结果),您就可以区分变体所拥有的类型。

【讨论】:

以上是关于不同数值类型的相同比较的主要内容,如果未能解决你的问题,请参考以下文章

记录学习

keil宏定义数值大小问题

==与===

数据库:表操作-数据类型(数值类型)

Go中的struct比较知识点

Oracle字符类型与数值类型的转换