gpt4 book ai didi

c++ - 如何从 C++20 中的范围创建一个新字符串?

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

创建 std::string 的最简洁和/或惯用的方法是什么?从(另一个字符串的)转换 View ?
我能想到的最好的方法是使用 std::ranges::copy以 View 和插入器作为参数,即使只有 gcc(10.2 和主干)才接受,但 clang 11.x 不接受。
对于大多数 ranges算法,我认为意图是 operator|可以在函数的第一个参数是范围时使用,所以我想知道为什么 2nd 和 IMHO 更清洁的变体不能编译(错误消息是没有找到匹配的 copy),并且意图可能最终让它编译,还是什么?
我尝试了 gcc 10.2 和 gcc (11) 主干。 Clang 也不编译第一种形式:(

#include <algorithm>
#include <cctype>
#include <iterator>
#include <ranges>
#include <string>

int main() {
std::string original = "foo";
std::string upper;

// This compiles on gcc 10.2/11-trunk only
std::ranges::copy(
original
| std::ranges::views::transform([](char c){return std::toupper(c);}),
std::back_inserter(upper)
);

// The below doesn't compile period
original
| std::ranges::views::transform([](char c){return std::toupper(c);})
| std::ranges::copy(std::back_inserter(upper));
}

最佳答案

For most ranges algorithms, I thought the intent was that the operator| can be used whenever the first argument to a function is a range


这不太对。 operator|仅适用于第一个参数是一个范围并且结果是一个范围的那些算法。 transform , filter , take等,都是采用范围并返回范围的算法。更具体地说,他们接受了 viewable_range并返回 view .
但对于所有其他算法 - max , find_if , any_of等 - 不返回范围,没有 |他们的替代品。所以这:
    original
| std::ranges::views::transform([](char c){return std::toupper(c);})
| std::ranges::copy(std::back_inserter(upper));
甚至不打算工作,因为 copy不是返回 view 的算法之一,所以它不会得到 |支持。管道重写运算符提案 ( P2011 ) 的动机之一是能够使用此类功能(无需大量库机制来使其工作)。

另一方面,这:
    std::ranges::copy(
original
| std::ranges::views::transform([](char c){return std::toupper(c);}),
std::back_inserter(upper)
);
是完全有效的代码,旨在工作。这是由于 clang 过于急切地检查某些概念造成的(参见 bug 47509)。我认为还有另一个错误报告,只是暂时找不到。

终于 ranges::to将采用 from range-v3,因此预期的惯用结构将是:
    std::string upper = 
original
| std::ranges::views::transform([](char c){return std::toupper(c);}),
| std::ranges::to<std::string>();
在此之前,您可以将 range-v3 用于 to .

关于c++ - 如何从 C++20 中的范围创建一个新字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65832202/

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