meta: FIX sfinae idiom in use_* aliases
This commit is contained in:
parent
d127713711
commit
7e25067468
@ -53,10 +53,6 @@ namespace utl {
|
|||||||
template<typename _Tp> // Partial specialization for false.
|
template<typename _Tp> // Partial specialization for false.
|
||||||
struct if_ <false, _Tp> { };
|
struct if_ <false, _Tp> { };
|
||||||
|
|
||||||
//! Alias template for if_
|
|
||||||
template<bool _C, typename _Tp = void>
|
|
||||||
using if_t = typename if_<_C, _Tp>::type;
|
|
||||||
//! @}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
@ -54,71 +54,34 @@ namespace utl {
|
|||||||
using void_t = typename void_t_impl<_Ts...>::type;
|
using void_t = typename void_t_impl<_Ts...>::type;
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
//! Alias template for if_
|
||||||
|
template<bool _C, typename _Tp = void>
|
||||||
|
using if_t = typename if_<_C, _Tp>::type;
|
||||||
|
|
||||||
//! If same type resolves to _Ret, else SFINAE
|
//! Publicly recognized alias template for if_
|
||||||
//! @{
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
struct use_if_same_ {
|
|
||||||
using type = if_t <
|
|
||||||
same_<_T1, _T2>::value,
|
|
||||||
_Ret
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
using use_if_same_t = typename use_if_same_<_T1, _T2, _Ret>::type;
|
|
||||||
//! @}
|
|
||||||
|
|
||||||
|
|
||||||
//! If not same type resolves to _Ret, else SFINAE
|
|
||||||
//! @{
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
struct use_if_not_same_ {
|
|
||||||
using type = if_t <
|
|
||||||
!same_<_T1, _T2>::value,
|
|
||||||
_Ret
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
using use_if_not_same_t = typename use_if_not_same_<_T1, _T2, _Ret>::type;
|
|
||||||
//! @}
|
|
||||||
|
|
||||||
|
|
||||||
//! If any type (_T1 or _T2) type resolves to _Ret, else to SFINAE
|
|
||||||
//! @{
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
struct use_if_any_ {
|
|
||||||
using type = if_t <
|
|
||||||
or_<_T1, _T2>::value,
|
|
||||||
_Ret
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
using use_if_any_t = typename use_if_any_<_T1, _T2, _Ret>::type;
|
|
||||||
//! @}
|
|
||||||
|
|
||||||
|
|
||||||
//! If both type (_T1 and _T2) type resolves to _Ret, else to SFINAE
|
|
||||||
//! @{
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
struct use_if_both_ {
|
|
||||||
using type = if_t <
|
|
||||||
and_<_T1, _T2>::value,
|
|
||||||
_Ret
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
template <typename _T1, typename _T2, typename _Ret =_T1>
|
|
||||||
using use_if_both_t = typename use_if_both_<_T1, _T2, _Ret>::type;
|
|
||||||
//! @}
|
|
||||||
|
|
||||||
//! Publicly recognized alias template for if_t
|
|
||||||
template<bool _C, typename _Tp = void>
|
template<bool _C, typename _Tp = void>
|
||||||
using enable_if_t = typename if_<_C, _Tp>::type;
|
using enable_if_t = typename if_<_C, _Tp>::type;
|
||||||
|
|
||||||
//! Uniform use_ style alias template for if_t
|
//! Uniform alias template for if_
|
||||||
//!@{
|
|
||||||
template<bool _C, typename _Tp = void>
|
template<bool _C, typename _Tp = void>
|
||||||
using use_if_t = typename if_<_C, _Tp>::type;
|
using use_if_t = typename if_<_C, _Tp>::type;
|
||||||
//!@{
|
|
||||||
|
//! If same type resolves to _Ret, else SFINAE
|
||||||
|
template <typename _T1, typename _T2, typename _Ret =_T1>
|
||||||
|
using use_if_same_t = typename if_<same_<_T1, _T2>::value, _Ret>::type;
|
||||||
|
|
||||||
|
//! If not same type resolves to _Ret, else SFINAE
|
||||||
|
template <typename _T1, typename _T2, typename _Ret =_T1>
|
||||||
|
using use_if_not_same_t = typename if_<!same_<_T1, _T2>::value, _Ret>::type;
|
||||||
|
|
||||||
|
//! If any type (_T1 or _T2) type resolves to _Ret, else to SFINAE
|
||||||
|
template <typename _T1, typename _T2, typename _Ret =_T1>
|
||||||
|
using use_if_any_t = typename if_<or_<_T1, _T2>::value, _Ret>::type;
|
||||||
|
|
||||||
|
//! If both type (_T1 and _T2) type resolves to _Ret, else to SFINAE
|
||||||
|
template <typename _T1, typename _T2, typename _Ret =_T1>
|
||||||
|
using use_if_both_t = typename if_<and_<_T1, _T2>::value, _Ret>::type;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user