整数型が表現可能な範囲の大小 - boost::numeric::is_subranged

ある整数型がある整数型で表現可能(前者が表現可能な値の範囲が,後者が表現可能な値の範囲の部分集合になっている)かどうかを判定する特性クラスとして boost::numeric::is_subranged

template<class T, class S>
boost::numeric::is_subranged

という特性クラスがある.で,この特性クラスは T と S の範囲が完全に一致するときは偽を返す(T が表現可能な値の範囲が, S が表現可能な値の範囲の真部分集合であるときだけ真を返す)のでびみょ〜に使いにくいときがある.ある整数型 T がある整数型 U で完全に表現可能であるかどうか(boost::numeric::is_subranged が真を返す場合,または T と U の表現可能な範囲が完全に一致する場合に真を返す)っつー特性クラスはどうやればええんじゃろか?

template<class T, class U>
struct is_representable
  : public boost::mpl::or_<
      boost::mpl::and_<
        boost::mpl::bool_< std::numeric_limits<T>::is_integer >
      , boost::mpl::bool_< std::numeric_limits<U>::is_integer >
      , boost::mpl::equal_to<
          boost::mpl::int_< std::numeric_limits<T>::digits >
        , boost::mpl::int_< std::numeric_limits<U>::digits >
        >
      , boost::mpl::equal_to<
          boost::mpl::bool_< std::numeric_limits<T>::is_signed >
        , boost::mpl::bool_< std::numeric_limits<U>::is_signed >
        >
      >
    , boost::numeric::is_subranged<T, U>
    >
{};

これでええのんかのー.