целочисленные черты (is_integer, is_integral) - PullRequest
1 голос
/ 10 августа 2010

Мне нужны две черты, касающиеся целых чисел.

  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 равно true).На какие риски я рискну, если специализируюсь на этой черте int_wrapper?Знаете ли вы класс черт (например, в Boost), который соответствует моим потребностям?

  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 Ответ

2 голосов
/ 10 августа 2010

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

...