types/traits: add try_underlying

This commit is contained in:
Danny Robson 2020-09-11 13:36:17 +10:00
parent 34aed6c74d
commit c23d2e38f3

View File

@ -120,6 +120,20 @@ template <typename ValueT>
using try_signed_t = typename try_signed<ValueT>::type; using try_signed_t = typename try_signed<ValueT>::type;
///////////////////////////////////////////////////////////////////////////////
namespace cruft {
template <typename ValueT, typename = void>
struct try_underlying { using type = ValueT; };
template <typename ValueT>
struct try_underlying<
ValueT,
std::void_t<std::underlying_type_t<ValueT>>
> { using type = std::underlying_type<ValueT>; };
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
/// checks if a type can be converted in all cases without modification /// checks if a type can be converted in all cases without modification
template <typename T, typename U> struct is_lossless_cast : std::enable_if< template <typename T, typename U> struct is_lossless_cast : std::enable_if<