是否有类型特征检查类型之间的包含?

时间:2019-01-09 11:52:14

标签: c++ boost typetraits c++03

我正在寻找一种类型特征,该特征可以知道某个类型的范围是否包含在另一个类型中。当is_included_in<T,U>::value类型的每个值都可以存储为true类型的值时,TU的类型特征。示例:

is_included_in<float,double>::value; // true
is_included_in<double,float>::value; // false
is_included_in<int,double>::value; // true
is_included_in<bool,long int>::value; // true
is_included_in<long long int,float>::value; // false

Boost可以做到这一点吗?还是我自己写?

注意:出于兼容性原因,我不使用C ++ 11。

2 个答案:

答案 0 :(得分:2)

不,你必须自己做。

话虽如此,如果您想使用它来使算术转换值安全,Boost已经拥有numeric_cast来实现这一目标。

因此,根据您的目标,您可能不需要特质。

至少您可能可以检查numeric_cast实现并使用其原理来构建自己的特征。

答案 1 :(得分:1)

对于基本整数和浮点类型,可以按如下方式比较它们的位数

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