Для основных целочисленных типов и типов с плавающей точкой вы можете сравнить их количество цифр следующим образом:
template <typename T, typename U>
struct is_included_in
: boost::integral_constant<bool,
std::numeric_limits<T>::digits <= std::numeric_limits<U>::digits> { };
Это работает для всех ваших примерных дел. Единственная проблема заключается в том, что он дает true
, например, <float, long>
. Здесь помогает частичная специализация:
template <typename T, typename U,
bool = boost::is_floating_point<T>::value && boost::is_integral<U>::value>
struct is_included_in
: boost::integral_constant<bool,
std::numeric_limits<T>::digits <= std::numeric_limits<U>::digits> { };
template <typename T, typename U>
struct is_included_in<T, U, true> : boost::false_type { };
Демонстрация в реальном времени: https://wandbox.org/permlink/NBXFOUK8fX9sxyfm.