类型之间是否有类型特征检查包含?
Is there a typetrait checking inclusion between types?
我正在寻找能够知道一个类型的范围是否包含在另一个类型中的类型特征。当类型 T
的每个值都可以存储为类型 U
的值时,is_included_in<T,U>::value
是 true
的类型特征。示例:
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。
不,你必须自己制作。
话虽这么说,如果您想使用它来使算术转换值安全,Boost 已经 numeric_cast
实现了这一点。
因此,根据您的目标,您可能不需要特质。
至少您可以检查 numeric_cast
实现并使用其原理来构建您自己的特征。
对于基本整数和浮点类型,您可以比较它们的位数,如下所示:
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 { };
我正在寻找能够知道一个类型的范围是否包含在另一个类型中的类型特征。当类型 T
的每个值都可以存储为类型 U
的值时,is_included_in<T,U>::value
是 true
的类型特征。示例:
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。
不,你必须自己制作。
话虽这么说,如果您想使用它来使算术转换值安全,Boost 已经 numeric_cast
实现了这一点。
因此,根据您的目标,您可能不需要特质。
至少您可以检查 numeric_cast
实现并使用其原理来构建您自己的特征。
对于基本整数和浮点类型,您可以比较它们的位数,如下所示:
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 { };