迭代表示为 std::basic_string_view 的正则表达式子匹配

Mat*_*ias 2 c++ tokenize c++17

是否有直接有效的方式转换std::sub_matchstd::basic_string_view(无需构建中间std::basic_string和没有中间堆分配)?或者进一步的抽象级别,是否有替代方法来std::regex_token_iterator迭代表示为std::basic_string_view而不是std::sub_match使用std(C++17)的正则表达式子匹配?

我宁愿使用std::basic_string_viewover的原因std::sub_match是:

  • std::basic_string_view指的是一个连续连续的类似字符的对象序列,该序列的第一个元素位于零位置。这允许使用charconv's std::from_chars(令人惊讶的是,它没有使用ForwardIterators实现)。对于std::sub_match,情况似乎并非如此,因为它表示为一对BidirectionalIterators。
  • std::basic_string_view 具有更丰富的类似字符串的接口,在某些文件格式的某些特殊情况下促进额外的上下文敏感标记化。

T.C*_*.C. 5

没有通用的方法来检测迭代器是否连续。我们仍然可以处理已知的连续迭代器 - 例如std::string

std::string_view as_sv(std::ssub_match m) {
    if(!m.matched) return {};
    return { &*m.first, m.second - m.first };
}
Run Code Online (Sandbox Code Playgroud)

处理其余的命名特化sub_match留给读者作为练习。

  • 是的。否则 `&*m.first` 可能无效。 (4认同)