35template <
typename First,
typename Second>
37 using type = conditional_t<!is_empty<First>::value || is_empty<Second>::value, First, Second>;
39 using second = Second;
41 pair(type& v) : ref_(v) { }
44 pair(
const type& v) : ref_(
const_cast<type&
>(v)) { }
50 operator const type&()
const {
58 const type* operator->()
const {
66 const type& operator*()
const {
74template <typename First, typename Second, if_t<is_empty<First>::value> = 0>
78using raw_type_t = remove_pointer_t<remove_reference_t<T>>;
83 static constexpr bool value = is_base_of<_::pair_base, raw_type_t<T> >::value;
88using pair_first_t = transcribe_cv_t<remove_reference_t<P>,
typename raw_type_t<P>::first>;
92using pair_second_t = transcribe_cv_t<remove_reference_t<P>,
typename raw_type_t<P>::second>;
96using pair_type_t = transcribe_cvp_t<remove_reference_t<P>,
typename raw_type_t<P>::type>;
99template <
typename T,
typename U =
int>
119 using type = decay_t< actual_type_t<T> >;
123using base_type_t =
typename base_type<T>::type;
129 using type = remove_pointer_t< remove_reference_t< actual_type_t<T> > >;
133using base_arg_type_t =
typename base_arg_type<T>::type;
139 static constexpr bool value =
140 std::is_same<T, actual_type_t<T> >::value && !is_enum<T>::value;
transcribe_cvp_t< remove_reference_t< P >, typename raw_type_t< P >::type > pair_type_t
Get pair::type type from pair while preserving cv qualifiers and pointer type.
transcribe_cv_t< remove_reference_t< P >, typename raw_type_t< P >::second > pair_second_t
Get pair::second from pair while preserving cv qualifiers.
transcribe_cv_t< remove_reference_t< P >, typename raw_type_t< P >::first > pair_first_t
Get pair::first from pair while preserving cv qualifiers.
Get actual type from a regular type or pair.
Type that represents a pair.