C++ 类型之间是否存在类型特征检查包含?

C++ 类型之间是否存在类型特征检查包含?,c++,boost,typetraits,c++03,C++,Boost,Typetraits,C++03,我正在寻找一种类型特征,它能够知道一个类型的范围是否包含在另一个类型中。当类型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_i

我正在寻找一种类型特征,它能够知道一个类型的范围是否包含在另一个类型中。当类型
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
是否包含在::value;//真的
是否包含在::value;//假的
是否包含在::value;//真的
是否包含在::value;//真的
是否包含在::value;//假的
Boost中有什么东西可以做到这一点吗?还是要我自己写


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

不,您必须自己制作

这就是说,如果你想用它来保证算术转换值的安全,Boost已经实现了这一点

因此,根据你的目标,你可能不需要某种特质


至少您可以检查
数值转换的实现,并使用其原理构建自己的特性。

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

template <typename T, typename U>  
struct is_included_in
  : boost::integral_constant<bool,
      std::numeric_limits<T>::digits <= std::numeric_limits<U>::digits> { };

现场演示:。

您可以根据
std::numeric\u限制来拼凑一些东西。应该很容易使用它来推导比较两个整数或两个浮点类型的规则。棘手的部分是如何处理整数和浮点类型之间的规则。@SamVarshavchik可以在这里帮助找出mantisa的大小。如果问题的框架被特别标记(或者基本上是相同的),人们不应该质疑它。毕竟,这就是我们有标签的原因!我并不是在考虑联系那些69名观察者,而是想更好地限制这个问题。我知道这里的搜索引擎利用标签。它甚至可以更好地显示相关问题。而且,尽可能具体是很好的,IMO语言修订标签是其中的一个重要部分。我不明白,但我确实明白,当我检查发布的任何问题时,我一定会寻找进一步的约束标记。我的意思是我怀疑我是唯一一个这样工作的人!请注意,这也是为什么您应该确保始终首先使用的原因-我看到有很多问题遗漏了,如果有或将始终在中编辑它。总之,你做得对,继续!我认为这并不能回答问题。从Boost docs:numeric_cast返回将Source类型的值转换为Target类型的值的结果。因此,它只检查单个值是否可以“安全”强制转换。但是,OP关心源类型的所有可能值。有没有可能使用
numeric\u cast
?@DanielLangr我的观点是,如果OP想要将这种假设特征作为类似
numeric\u cast
的解决方案的一部分,那么他们可以使用
numeric\u cast
。另外,他们还可以使用
数值转换的实现(至少必须包含他们询问的逻辑)来创建假设特征。否则答案是“不”。我觉得我涵盖了所有这些基础…一个简单的检查就是在条件中添加一个检查,例如:
is_integral::value==is_integral::value
is floating_point::value==is_floating_point::value
。如果这两种特性都不可用,可以手动创建。@LuisMachuca我不知道这样的检查有什么用。为了防止浮点类型和整数类型之间的“包含”,它们的范围和粒度实际上是不可比较的(你打算把
-3154.901107
放在
长的
范围内的什么地方?@LuisMachuca你的检查不包括
T
是整数而
U
是浮点的情况。在我的解决方案中,你需要3个正比较,而不是1个“负”比较。
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 { };