gpt4 book ai didi

c++ - 不同数值类型的相同比较

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:39 27 4
gpt4 key购买 nike

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

#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 上,这会导致警告。

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

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

最佳答案

Is this safe?

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

Value v1 = std::int64_t{std::numeric_limits<std::int64_t>::min()};
Value v2 = std::uint64_t{42};

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

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

If not how can it be accomplished safely?

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

关于c++ - 不同数值类型的相同比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947558/

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