c++ - 使用范围拆分 string_view

标签 c++ c++20 std-ranges

我有一个字符串,其中包含用 , 字符分隔的数字序列。为了将序列中的值读入数组,我创建了以下 GCC 10 拒绝编译的代码:

#include <ranges>
#include <string_view>
#include <charconv>
#include <array>

template<std::size_t Sz>
bool to_bytes(std::array<std::uint8_t, Sz> &data, std::string_view string) {
    auto target = data.rbegin();
    for (const auto octet : string | std::views::split('.')) {
        if (target == data.rend()) {
            return false;
        }

        const auto octet_begin = octet.data();
        const auto octet_end = octet_begin + octet.size();
        const auto error = std::error_code(std::from_chars(octet_begin, octet_end, *target).ec);
        if (error) {
            return false;
        }

        ++target;
    }

    return target == data.rend();
}

简而言之,编译器提示没有data()size() 方法可用于octet 变量的类型。我是否误解了 octet 类型应该像 string_view 一样满足 contiguous_range 标准?从我的 POV 来看,这似乎是有争议的。

最佳答案

通过后P2210作为针对 C++20 的缺陷报告,views::split 现在可以保持连续性,所以上面的代码现在有效并且 compiles on gcc trunk .


Do I misunderstand that type of octet should meet the contiguous_range criteria as the string_view does?

是的。 octet 不是 contiguous_rangesplit_view 的内部范围永远不会强于 forward_range - 它只会是 forward_rangeinput_range .

这使得 views::split 非常难以用于任何类型的非平凡解析 - 正是因为,正如您在问题中所展示的那样,您不能使用像 from_chars 这样的东西(或 scanf 或 ...),除非您随后手动从中生成一个连续的范围。

关于c++ - 使用范围拆分 string_view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62097987/

相关文章:

C++20 "transparently replaceable"关系

c++ - C++23 中 default_constructible 范围适配器的含义是什么?

c++ - 组合范围适配器和 std::source_location 得到了奇怪的结果

c++ - 在C++ 20中按长度排序std::vector <std::string>的代码是否正确?

c++ - 使用 QWT 和 Microsoft Visual C++ 2010 绘制 MatLab 等效图

c++ - Qt - 与 BLE 设备断开连接

c++ - 有没有一种在转换后使用 views::filter 的有效方法? (范围适配器)

c++ - 通过 char C++ 检查 stringstream line char

c++ - 为什么此代码会导致访问错误?

c++ - 模板模板类型的计数参数