不同数值类型的相同比较
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。这样,只要比较需要它做正确的事情(即返回预期的结果),您就可以区分变体所拥有的类型。
【讨论】:
以上是关于不同数值类型的相同比较的主要内容,如果未能解决你的问题,请参考以下文章