最終更新日時: 2026年02月08日 18時00分28秒 (JST)
yoh が更新

履歴 編集

concept
<tuple>

# std::pair-like(C++20)

    namespace std {
      namespace ranges {
        // C++20
        template<class T>
        concept pair-like = // 説明専用コンセプト
          !is_reference_v<T> && requires(T t) {
            typename tuple_size<T>::type; // tuple_size<T> が完全型であることを明確にする
            requires derived_from<tuple_size<T>, integral_constant<size_t, 2>>;
            typename tuple_element_t<0, remove_const_t<T>>;
            typename tuple_element_t<1, remove_const_t<T>>;
            { get<0>(t) } -> convertible_to<const tuple_element_t<0, T>&>;
            { get<1>(t) } -> convertible_to<const tuple_element_t<1, T>&>;
          };
      }

      // C++23 以降
      template <typename T>
      concept pair-like // 説明専用コンセプト
        = tuple-like<T> && tuple_size_v<remove_cvref_t<T>> == 2;
    }

## 概要

`pair-like`は型`T`が`pair`のような型であることを表現する説明専用コンセプトである。C++23 では`tuple-like`の追加に伴って定義が変更された。

`ranges::subrange`での`operator PairLike`の定義など、`<ranges>`での定義に使用されている。

C++23 以降では`array`、`pair`、`tuple`、`ranges::subrange`らの互換性を高める（相互に構築・比較などが出来るようにする）ためにも使用される。

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `tuple-like`

## 参照

- P2165R4 Compatibility between `tuple`, `pair` and tuple-like objects