我需要两个关于整数的特征。
第一个就像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)吗?
我需要的第二个特性是具有整数语义的类型(具有位算术运算,位操作等)。例如,来自GMP的int_wrapper
将满足此特征。 mpz_class
适合这个特性吗?我读到两者都可以专门化并设置std::numeric_limits<T>::is_integer
如果numeric_limits<T>::is_integer == true
表现得像一个整数,而且(在C ++标准中)术语“整数”和“整数”是同义词(其中)我们应该始终拥有T
)
总之,我是否更好地根据我的确切需求定义自己的特征,或者尝试扩展标准特征?
答案 0 :(得分:2)
这取决于您是否希望使用boost和其他标准库将您的类视为不可变的。如果是这样,除了专门的std / boost :: is_integral&lt;&gt;之外别无他法。否则,请创建自己的is_integral&lt;&gt;其默认实现转发到std / boost :: is_integral&lt;&gt;并专门为你的整体包装。