使用范围拆分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();
}
简而言之,编译器抱怨没有可用于octet
变量类型的data()
和size()
方法。我是否误解了octet
类型应该像string_view
一样符合contiguous_range
标准?从我的 POV 来看,这似乎是争论的。
在采用 P2210 作为针对 C++20 的缺陷报告后,views::split
现在可以保持连续性,因此上述代码现在有效并在 gcc 主干上编译。
我是否误解了
octet
类型应该像string_view
一样符合contiguous_range
标准?
是的。octet
不是contiguous_range
.split_view
的内部范围永远不会比forward_range
强——它只是一个forward_range
或一个input_range
。
这使得views::split
用于任何类型的非平凡解析都非常尴尬 - 正是因为,正如您在问题中演示的那样,您不能使用from_chars
(或scanf
或...(之类的东西,除非您手动生成一个连续的范围。
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 使用char类型将decimal转换为string,将string转换为decimal
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 将向量解析<string>为字符串
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 如何更改大小(std::string)
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- std::string 的对象真的可以移动吗?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- <string> 使用 for 循环写入向量
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串