целочисленные черты (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? Вы знаете о классе черты (например, в Повышении), которые соответствуют моим потребностям?

  2. Вторая черта, в которой я нуждаюсь, для типов, имеющих целочисленную семантику (с арифметическими операциями битов, побитовыми обработками и т.д.). Например, 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)

В заключение я имею лучше определение моих собственных черт для моих точных потребностей или попытки, расширяющей стандартные?

1
задан rafak 10 August 2010 в 10:35
поделиться

1 ответ

Это зависит от того, хотите ли вы, чтобы boost и другие стандартные библиотеки рассматривали ваш класс как целостный. Если это так, у вас нет другого пути, кроме как специализироваться на std / boost :: is_integral <>. В противном случае создайте свой собственный is_integral <> с его реализацией по умолчанию, перенаправляющей его на std / boost :: is_integral <> и специализировав его для вашей интегральной оболочки.

2
ответ дан 2 September 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: