gpt4 book ai didi

C++ 安全高效地将 std::weak_ordering 转换为 int

转载 作者:行者123 更新时间:2023-12-05 09:06:12 25 4
gpt4 key购买 nike

C++20 引入了一种新的比较类型:std::weak_ordering .

它允许表示小于、等于或大于。

但是,一些较旧的函数使用 int 来达到类似的目的。如qsort ,它使用签名

int compar (const void* p1, const void* p2);

如何将 std::weak_ordering 转换为 int 以用于 qsort 等函数?

这是一个示例情况:

#include <compare>
#include <iostream>

int main() {
long a = 2354, b = 1234;
std::weak_ordering cmp = a <=> b;

if (cmp > 0) std::cout << "a is greater than b" << std::endl;
if (cmp == 0) std::cout << "a is equal to b" << std::endl;
if (cmp < 0) std::cout << "a is less than b" << std::endl;

int equivalent_cmp = cmp; // errors
}

在测试中,我注意到使用 reinterpret_castint8_t 类型确实有效,但我不确定这是否可移植。

int equivalent_cmp = *(int8_t *)&cmp;

或等效地,

int equivalent_cmp = *reinterpret_cast<int8_t*>(&cmp);

这样安全吗?

此外,还有一些其他解决方案可以工作,但与这种“不安全”的方法相比效率低下。所有这些都会比上述解决方案慢

    int equivalent_cmp = (a > b) - (a < b);

    int equivalent_cmp;
if (cmp < 0) equivalent_cmp = -1;
else if (cmp == 0) equivalent_cmp = 0;
else equivalent_cmp = 1;

是否有更好的解决方案可以保证有效?

最佳答案

Is there a better solution that would be guaranteed to work?

没有。

该标准未指定排序类的内容或表示。 Barry 的回答基于合理的假设,这些假设可能成立,但不能保证。

如果您需要它,最好的办法是编写类似于您上一个片段的内容

constexpr int ordering_as_int(std::weak_ordering cmp) noexcept {
return (cmp < 0) ? -1 : ((cmp == 0) ? 0 : 1);
}

关于C++ 安全高效地将 std::weak_ordering 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66181029/

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