- tuple[meta header]
- concept[meta id-type]
- std[meta namespace]
- cpp20[meta cpp]
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;
}
- tuple_element_t[link tuple_element.md]
- tuple_size[link tuple_size.md]
- tuple_size_v[link tuple_size.md]
- is_reference_v[link /reference/type_traits/is_reference.md]
- integral_constant[link /reference/type_traits/integral_constant.md]
- remove_const_t[link /reference/type_traits/remove_const.md]
- remove_cvref_t[link /reference/type_traits/remove_cvref.md]
- convertible_to[link /reference/concepts/convertible_to.md]
- tuple-like[link tuple-like.md]
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++: ??