Использование Numeric_Limits :: Max () в постоянных выражениях

StackOverflow https://stackoverflow.com/questions/2738435

Вопрос

Я хотел бы определить внутри класса постоянную, какую ценность является максимально возможным Int. Что-то вроде этого:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}

Это объявление не скомпилировало со следующим сообщением:

numeric.cpp: 8: Ошибка: 'std :: numeric_limits :: max ()' не может появиться в постоянном выражении numeric.cpp: 8: Ошибка: Вызов функции не может появиться в постоянном выражении.

Я понимаю, почему это не работает, но две вещи выглядят странно для меня:

  1. Мне кажется естественное решение использовать ценность в постоянных выражениях. Почему дизайнеры языка решили сделать Максимум() Функция, таким образом, не позволяющая этому использованию?

  2. Спецификация претензий в 18.2.1, что

    Для всех членов заявлено Static Const в шаблоне Numeric_limits, специализации должны определять эти значения таким образом, чтобы они были полезны в качестве интегральных постоянных выражений.

    Разве это не значит, что я должен быть в состоянии использовать его в моем сценарии и не противоречит сообщение об ошибке?

Спасибо.

Это было полезно?

Решение

Хотя текущий стандарт не хватает поддержки здесь, для интегральных типов Boost.integertraits. дает вам константы времени компиляции const_min а также const_max.

Проблема возникает из §9.4.2/4:

Если статический элемент данных имеет встроенный тип перечисления Const, его декларация в определении класса может указать константу-инициализатор, который должен быть интегральным постоянным выражением (5.19). В этом случае член может появиться в интегральных постоянных выражениях.

Обратите внимание, что добавляет:

Участник все еще должен быть определен в области пространства, если он используется в программе, и определение области пространства имен не должно содержать инициализатора.

Как другие уже упомянутые numeric_limitс min() а также max() Просто не встроенные постоянные выражения, то есть константы времени компиляции.

Другие советы

Выглядит как немного дефекта ...

В C ++ 0x, numeric_limits будет иметь все отмеченное constexpr, означает, что вы сможете использовать min() а также max() как константы с компиляцией.

Ты хочешь:

#include <limits>

struct A {
static const int ERROR_VALUE;
}; 

const int A::ERROR_VALUE = std::numeric_limits<int>::max();

Поместите класс / структуру в заголовке и определение в файле .CPP.

Это не противоречит, потому что max не определен static const. Отказ Это просто статическая функция участника. Функции не могут быть Const, и функции статического элемента не могут иметь конский прикрепленный в самом праве.

Есть также double max() в двойной версии пределов, а в C ++ 03 это не будет работать, чтобы сказать static double const max = .... Отказ Так, чтобы быть последовательным, max() это функция для всех версий предельного шаблона.

Теперь, как известно, что max() не может быть использован таким, как это плохо, а C ++ 0x уже решает его, делая его constexpr Функция, позволяющая вашему предлагаемому использованию.

  • Я постараюсь ответить вам так сильно, как я понял из вашего вопроса:

1- Если вы хотите, чтобы статический Const int в вашей программе будет инициализироваться с функцией:

int Data()
{
 return rand();
}

class A
{
public :
    static const int ee;
};
const int A::ee=Data();

Это работает на VS 2008

2- Если вы хотите получить максимальный и мин номер для данного типа данных, то используйте эти определения INT_MAX, INT_MIN, Long_max и т. Д.

3-, если однако, вам нужно использовать эти тип шаблона WRT, затем жесткий код шаблонов себя

template<>
int MaxData()
{
 return INT_MAX;
}

а также

template<>
long MaxData()
{
 return LONG_MAX ;
}

и называть их как это

int y=MaxData<int>();

4- И если вы только имеете дело с бинарными представленными типами, то используйте это:

template <class T>
T MaxData(){
    return ~(1<<((sizeof(T)*8)-1));
}

и это

template <class T>
T MinData(){
    return (1<<((sizeof(T)*8)-1));
}

Надеюсь, это может помочь вам ..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top