整数特征(is_integer,is_integral)

时间:2010-08-10 10:35:27

标签: c++ traits typetraits

我需要两个关于整数的特征。

  1. 第一个就像std::is_integral(或boost::is_integral),但可以与用户定义的类型一起使用(例如包裹int的类,比如{{1} }):如果类型的行为类似于整数并且其表示类似于标准整数类型,则为true(例如int_wrapper如果sizeof(T) * CHAR_BITS == std::numeric_limits<T>::digits是无符号的)但是整数类型的定义非常严格,因为它包含这些类型的列表。因此,T专门化似乎很难,如果不是禁止的话(尽管我没有明确说明):std::is_integral是一种“主要”类型特征(20.7.4.1,注3:确切地说,一个主要类型特征是真的类型T,在我的情况下is_integral已经int_wrapper等于true。 如果我将此特性专门用于is_class,我会冒哪些风险? 你知道一个适合我需要的特质课程(例如Boost)吗?

  2. 我需要的第二个特性是具有整数语义的类型(具有位算术运算,位操作等)。例如,来自GMP的int_wrapper将满足此特征。 mpz_class适合这个特性吗?我读到两者都可以专门化并设置std::numeric_limits<T>::is_integer如果numeric_limits<T>::is_integer == true表现得像一个整数,而且(在C ++标准中)术语“整数”和“整数”是同义词(其中)我们应该始终拥有T

  3. 总之,我是否更好地根据我的确切需求定义自己的特征,或者尝试扩展标准特征?

1 个答案:

答案 0 :(得分:2)

这取决于您是否希望使用boost和其他标准库将您的类视为不可变的。如果是这样,除了专门的std / boost :: is_integral&lt;&gt;之外别无他法。否则,请创建自己的is_integral&lt;&gt;其默认实现转发到std / boost :: is_integral&lt;&gt;并专门为你的整体包装。