Namespaces
Variants

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

ja.cppreference.net から
 
 
Ranges ライブラリ
範囲アダプタ
 
 
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) ペアライク型が、可能性として異なる2つの与えられた型の値から構築可能かどうかを判定します。

以下と同等:

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以上)

戻り値

PairLike ( begin_  , end_  )

注記

標準ライブラリ内の以下の型はペアライクです:

(C++26以降)


これらの型のいずれかから派生したプログラム定義型は、以下の条件を満たす場合にpair-like型となり得る:

  • std::tuple_size と std::tuple_element が正しく特殊化されていること、および
  • std :: get < 0 > と std :: get < 1 > の呼び出しがその値に対してwell-formedであること。
(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

関連項目

型が tupleプロトコル を実装していることを指定
( std::get , std::tuple_element , std::tuple_size )
( 説明専用コンセプト* )