2010-08-10 42 views
1

我需要两个有关整数的特征。如果该类型的行为像的整数,并且其表示为真:整数特征(is_integer,is_integral)

  1. 第一个会像std::is_integral(或boost::is_integral),但与用户定义的类型可使用(例如类中封装一个int,说int_wrapper)像标准整数类型(例如sizeof(T) * CHAR_BITS == std::numeric_limits<T>::digits,如果T是无符号的)但整数类型的定义非常严格,因为它包含了这些类型的列表。所以如果专门化std::is_integral似乎很难,如果不禁止的话(尽管没有明确说明我认为):is_integral是一个“主要”类型特征(20.7.4.1,注3:对于类型T只有一个主要类型特征是真实的,在我的例子中为int_wrapper已经有is_class等于真)。 如果我专门针对int_wrapper这个特质,我会采取什么风险? 你知道一个符合我需求的特质类(例如Boost)吗?

  2. 我需要的第二个特征是具有整数语义的类型(包括位算术运算,位操作等)。例如来自GMP的mpz_class将满足这个特征。 std::numeric_limits<T>::is_integer是否适合这种特质?我同时认为,如果T的行为类似于整数,而且(在C++标准中)术语“整数”和“整数”是同义词(在这种情况下,我们总是应该有numeric_limits<T>::is_integer == is_integral<T>::value

    numeric_limits<T>::is_integer == true

总之,我是否更好地为自己的确切需求定义自己的特质,或尝试扩展标准特性?

回答

2

这取决于你是否希望boost和其他标准库将你的类视为整体。如果是这样,你没有其他办法,但专精std/boost :: is_integral <>。否则,请将您自己的is_integral <>的默认实现转发到std/boost :: is_integral <>,并将其专门用于您的集成包装。