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

来自cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
std::ranges::subrange
成员函数
subrange::operator PairLike
(C++20)
观察器
迭代器操作
推导指引
非成员函数
(C++20)
辅助类型
(C++20)
 
template< /* 见下文 */ 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<T>>;
        typename std::tuple_element_t<1, std::remove_const_t<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 起)
(C++23 前)
(3)
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>>;
(C++20 起)
(C++23 前)
template< class T, class U, class V >

concept pair-like-convertible-from =       // 仅用于阐述
    !ranges::range<T> && !std::is_reference_v<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>>;
(C++23 起)
1)subrange 转换到对子式类型(即实现了在下文定义的概念 pair-like (C++23 前)pair-like (C++23 起) 的类型)。等价于 return PairLike(i_, s_);,其中 i_s_ 分别是存储的迭代器与哨位。
PairLike 约束为 std::same_as<std::remove_cvref_t<PairLike>, subrange>false
此转换函数拥有 pair-like-convertible(见下文)所施加的额外约束。
2) 仅用于阐述的概念 pair-like 指定类型为对子式类型。通常而言,对子式类型的表达式 e 能用于结构化绑定(即 auto const& [x, y] = e; 通常良构)。此概念被标准库通用的概念 pair-like 替代。 (C++23 起)
3) 仅用于阐述的概念 pair-like-convertible-from 细化 pair-like。它
  • 拒绝引用类型和 (C++23 起) range 类型,
  • 要求 UV 分别可转换到 T 的第一和第二元素类型,并且
  • 要求从 U(将被替换成 const I&)的转换为非切片(见 convertible-to-non-slicing)。

参数

(无)

返回值

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

注解

下列类型都是对子式的:

从这些类型之一派生的程序定义类型在满足以下条件时可以是对子式的:

(C++23 前)

因为 subrange 特化是 range 类型,所以此转换函数不进行到它们的转换。

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

示例

#include <iostream>
#include <ranges>
#include <string>
#include <utility>
 
using striter = std::string::const_iterator;
 
using legacy_strview = std::pair<striter, striter>;
 
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