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++: ??