Мне нужны две черты, касающиеся целых чисел.
Первый будет похож на
std::is_integral
(илиboost::is_integral
), но его можно использовать с определенными пользователем типами (например, класс, обертывающийint
, скажем,int_wrapper
): true, если тип ведет себя как целое число и его представление похоже на стандартные целочисленные типы (например,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
равно true). На какой риск я иду, если выделю эту черту дляint_wrapper
? Знаете ли вы класс свойств (например, в Boost), который соответствует моим потребностям?Вторая черта, которая мне нужна, предназначена для типов, имеющих целочисленную семантику (с битовыми арифметическими операциями, битовыми манипуляциями и т. д.). Например,
mpz_class
из GMP удовлетворяет этому признаку. Подходит лиstd::numeric_limits<T>::is_integer
для этой черты? Я читал, что можно специализироваться и устанавливатьnumeric_limits<T>::is_integer == true
, еслиT
ведет себя как целое число, но также (в стандарте С++) что термины «интегральное» и «целое» являются синонимами (в этом случае мы всегда должны иметьnumeric_limits<T>::is_integer == is_integral<T>::value
)
В заключение, лучше ли мне определить свои собственные черты для своих конкретных потребностей или попытаться расширить стандартные?