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>
81 static constexpr bool value = is_base_of<_::pair_base, remove_reference_t<T> >::value;
87using pair_first_t = transcribe_cv_t<remove_reference_t<P>,
typename remove_reference_t<P>::first>;
91using pair_second_t = transcribe_cv_t<remove_reference_t<P>,
typename remove_reference_t<P>::second>;
95using pair_type_t = transcribe_cv_t<remove_reference_t<P>,
typename remove_reference_t<P>::type>;
98template <
typename T,
typename U =
int>
118 using type = decay_t< remove_pointer_t< actual_type_t<T> > >;
122using base_type_t =
typename base_type<T>::type;
128 using type = remove_pointer_t< remove_reference_t< actual_type_t<T> > >;
132using base_arg_type_t =
typename base_arg_type<T>::type;
138 static constexpr bool value =
139 std::is_same<T, actual_type_t<T> >::value && !is_enum<T>::value;
transcribe_cv_t< remove_reference_t< P >, typename remove_reference_t< P >::second > pair_second_t
Get pair::second from pair while preserving cv qualifiers.
transcribe_cv_t< remove_reference_t< P >, typename remove_reference_t< P >::first > pair_first_t
Get pair::first from pair while preserving cv qualifiers.
transcribe_cv_t< remove_reference_t< P >, typename remove_reference_t< P >::type > pair_type_t
Get pair::type type from pair while preserving cv qualifiers.
Get actual type from a regular type or pair.
Type that represents a pair.