名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
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*/ = /* see description */;
(2) (僅作說明*)
template< class T, class U, class V >
concept /*pair-like-convertible-from*/ = /* see description */;
(3) (僅作說明*)
1)subrange 轉換為類對型別。
關於 /*different-from*/ 的定義,請參閱 different-from
2) 確定型別是否為“類對”。

等價於

template< class T >
concept /*pair-like*/ =
    !std::is_reference_v<T> && requires(T t)
    {
        typename std::tuple_size<T>::type;
        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>&>;
    };
(直至 C++23)

這個概念等價於庫範圍內的僅用於說明的概念 pair-like

(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++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 起)

目錄

[edit] 返回值

PairLike(begin_ , end_ )

[edit] 注意

標準庫中以下型別是類對型別:

(C++26 起)


如果以下條件成立,則派生自上述型別之一的程式定義型別可以是類對型別:

(直至 C++23)

由於 subrange 特化是 range 型別,因此不會透過此轉換函式執行到它們的轉換。

std::array 特化不能從 subrange 轉換,因為它們是 range 型別。

[edit] 示例

#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

[edit] 參閱

指定型別實現了元組協議
(std::getstd::tuple_elementstd::tuple_size)
(僅用於說明的概念*)[編輯]