使用范围拆分 string_view
Splitting a string_view using 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
标准?从我的视角来看似乎是有争议的。
通过后P2210 as a defect report against C++20, views::split
can now preserve contiguity, so the above code is now valid and compiles on gcc trunk.
Do I misunderstand that type of octet
should meet the contiguous_range
criteria as the string_view
does?
是的。 octet
是 而不是 一个 contiguous_range
。 split_view
的内部范围永远不会强于 forward_range
- 它只会是 forward_range
或 input_range
.
这使得 views::split
非常难以用于任何类型的非平凡解析 - 正是因为,正如您在问题中所展示的那样,您不能使用 from_chars
之类的东西(或 scanf
或 ... ),除非您随后手动从中生成一个连续的范围。
我有一个字符串,其中包含以 ,
字符分隔的数字序列。为了将序列中的值读入数组,我创建了以下 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
标准?从我的视角来看似乎是有争议的。
通过后P2210 as a defect report against C++20, views::split
can now preserve contiguity, so the above code is now valid and compiles on gcc trunk.
Do I misunderstand that type of
octet
should meet thecontiguous_range
criteria as thestring_view
does?
是的。 octet
是 而不是 一个 contiguous_range
。 split_view
的内部范围永远不会强于 forward_range
- 它只会是 forward_range
或 input_range
.
这使得 views::split
非常难以用于任何类型的非平凡解析 - 正是因为,正如您在问题中所展示的那样,您不能使用 from_chars
之类的东西(或 scanf
或 ... ),除非您随后手动从中生成一个连续的范围。