целочисленные признаки (is_integer, is_integral)

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

  1. Первый будет похож на 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), который соответствует моим потребностям?

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

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


person rafak    schedule 10.08.2010    source источник


Ответы (1)


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

person Maxim Egorushkin    schedule 10.08.2010