gpt4 book ai didi

c++ - 测试元素是否使用 C++17 折叠表达式排序

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

我正在寻找一种方法来检查是否使用 c++ 折叠表达式对参数进行了排序。天真的方法:

template <typename... Args>
bool are_strictly_increasing(Args const&... args) {
return (args < ...);
}

扩展为 ((arg0 < arg1) < arg2) < ... 时不起作用最终将 bool 与类型名称 Args 进行比较(在编译时使用例如 int 可能是危险的,除非您提高警告级别)。

挑出列表中第一个参数的技巧适用于检查所有元素是否相等:

template <typename Arg, typename... Args>
bool are_all_equal(Arg const& arg0, Args const&... args) {
return ((arg0 == args) && ... );
}

但它在这里对运算符<不起作用,因为它只会测试是否所有参数都大于第一个参数。

最佳答案

在我看来,如果你的第一个论点无论如何都是孤立的,那会更好

template <typename A0, typename... Args>
constexpr bool are_strictly_increasing(A0 const & a0, Args const&... args)

假设参数有一个共同的类型

using CT = std::common_type_t<A0, Args...>;

给定两个普通类型的变量,一个用第一个参数初始化 a0

CT c0, c1 = a0;

你的折叠表达式可以是

return ((c0 = c1, c0 < (c1 = static_cast<CT>(args))) && ...);

如果不隔离第一个参数,就会出现 c1 的初始化问题.你可以试试 std::numeric_limits<CT>::min() , 但如果 args... 的第一个值,代码将失败等于此值(当您检查无符号值时,这并非不可能)。

下面是一个完整的编译示例

#include <iostream>

template <typename A0, typename... Args>
constexpr bool are_strictly_increasing(A0 const & a0, Args const&... args)
{
using CT = std::common_type_t<A0, Args...>;

CT c0, c1 = a0;

return ((c0 = c1, c0 < (c1 = static_cast<CT>(args))) && ...);
}

int main()
{
std::cout << are_strictly_increasing(0, 1, 2, 3, 4) << std::endl;
std::cout << are_strictly_increasing(0, short{1}, 2l, 3u, 4ull) << std::endl;
std::cout << are_strictly_increasing(0, 1, 2, 3, 4, 4) << std::endl;
std::cout << are_strictly_increasing(0, 1, 21, 3, 4, 4) << std::endl;
}

关于c++ - 测试元素是否使用 C++17 折叠表达式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71629529/

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