ある整数型がある整数型で表現可能(前者が表現可能な値の範囲が,後者が表現可能な値の範囲の部分集合になっている)かどうかを判定する特性クラスとして 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> > {};
これでええのんかのー.