std::ranges::subrange<I,S,K>::operator PairLike

来自cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
 
std::ranges::subrange
成员函数
subrange::operator PairLike
(C++20)
观察器
迭代器操作
推导指引
非成员函数
(C++20)
辅助类型
(C++20)
 
template< /*different-from*/<subrange> PairLike >

    requires /*pair-like-convertible-from*/<PairLike, const I&, const S&>

constexpr operator PairLike() const;
(1) (C++20 起)
辅助概念
template< class T >

concept /*pair-like*/ =                  // 仅用于阐释
  !std::is_reference_v<T> && requires(T t) {
    typename std::tuple_size<T>::type;   // 确保 std::tuple_size<T> 完整
    requires std::derived_from<std::tuple_size<T>,
                               std::integral_constant<std::size_t, 2>>;
    typename std::tuple_element_t<0, std::remove_const<T>>;
    typename std::tuple_element_t<1, std::remove_const<T>>;
    { std::get<0>(t) } -> std::convertible_to<const std::tuple_element_t<0, T>&>;
    { std::get<1>(t) } -> std::convertible_to<const std::tuple_element_t<1, T>&>;

  };
(2) (C++20 起)
template< class T, class U, class V >

concept /*pair-like-convertible-from*/ = // 仅用于阐释
  !ranges::range<T> && /*pair-like*/<T> &&
  std::constructible_from<T, U, V> &&
  /*convertible-to-non-slicing*/<U, std::tuple_element_t<0, T>> &&

  std::convertible_to<V, std::tuple_element_t<1, T>>;
(3) (C++20 起)
1) 转换 subrange 为 pair 式类型(即实现 pair-like 的类型,见后述)。等价于 return PairLike(i_, s_); ,其中 i_s_ 分别为存储的迭代器与哨位。此转换函数拥有 pair-like-convertible (见后述)所施加的额外约束。
2) 仅用于阐释的概念 pair-like 指定类型为 pair 式类型。通常而言, pair 式类型的表达式 e 能用于结构化绑定(即 auto const& [x, y] = e; 通常为良构)。同标准概念,此概念得到实现,若它得到满足且其蕴含的所有概念均得到实现。
3) 仅用于阐释的概念 pair-like-convertible-from 细化 pair-like 。它拒绝 range 类型,并要求 UV 分别可转换成 T 的第一与第二元素类型,并且从 U (将被替换成 const I& )的转换为非切片(见 convertible-to-non-slicing )。同标准概念,此概念得到实现,若它得到满足且其蕴含的所有概念均得到实现。

仅用于阐释的概念 different-from 为类型 TU 实现,当且仅当 std::decay_t<T>std::decay_t<U> 是不同的类型。

参数

(无)

返回值

从存储的迭代器与哨位直接初始化 PairLike 值。

注解

下列类型为 pair 式:

从这些类型之一或 std::variant 特化派生的程序定义类型为 pair 式,若

  • std::tuple_sizestd::tuple_element 对它正确特化,且
  • 对其值调用 std::get<0>std::get<1> 为良构。

由于 subrange 特化是 range 类型,到它们的转换不经由此转换函数进行。

std::array 特化不能从 subrange 转换而来,因为它们是 range 类型。

示例

#include <iostream>
#include <ranges>
#include <string>
#include <utility>
 
using legacy_strview = std::pair<
    std::string::const_iterator,
    std::string::const_iterator
>;
 
void legacy_print(legacy_strview p)
{
    for (; p.first != p.second; ++p.first)
        std::cout << *p.first << ' ';
    std::cout << '\n';
}
 
int main()
{
    std::string dat{"ABCDE"};
    for (auto v{ std::ranges::subrange{dat} }; v; v = {v.begin(), v.end() - 1}) {
        /*...*/
        legacy_print(legacy_strview{v});
    }
}

输出:

A B C D E 
A B C D 
A B C 
A B 
A