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