Присвоение статическому константному члену значения, поступающего из функции (точнее, из статического метода)

Не допускается следующее ('std::numeric_limits::max()' не может появляться в константном выражении):

#include <limits>   

struct MyStruct {

private:  
  static const unsigned int INVALID_VALUE = std::numeric_limits<unsigned int>::max();

public:
  unsigned int index;

  inline MyStruct() : index(INVALID_VALUE) {}
};

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


person Antonio    schedule 16.08.2013    source источник


Ответы (4)


Как насчет того, чтобы определить вашу константу как ~0U. Поскольку unsigned int определено как "прямое двоичное представление", в обратном ему должны быть установлены все биты.

person Mats Petersson    schedule 16.08.2013
comment
Это идеально подходит для моих нужд, спасибо! Я заменил его на ~static_cast<unsigned int>(0). Годы и годы работы с C++, впервые я понимаю оператор тильды, странно! - person Antonio; 16.08.2013

Вместо этого вы можете использовать UINT_MAX из <climits>.

Кроме того, вы можете дать определение:

struct MyStruct 
{
private:
  static const unsigned int INVALID_VALUE;
};

const unsigned int MyStruct::INVALID_VALUE = std::numeric_limits<unsigned int>::max();

Или переключитесь на C++11, где функция constexpr, и это нормально.

person jrok    schedule 16.08.2013

В C++11 или более поздних версиях это должно быть нормально, поскольку функции numeric_limits теперь объявлены как constexpr.

Если вы застряли в прошлом, вам нужно определить и инициализировать константу вне класса:

// Header file
struct MyStruct {
    static const unsigned int INVALID_VALUE;
    // ...
};

// One source file
const unsigned int Mystruct::INVALID_VALUE = std::numeric_limits<unsigned int>::max();

В качестве альтернативы вы можете использовать макрос UINT_MAX, определенный в <climits>. Это имеет то преимущество, что вашу константу можно будет использовать в постоянном выражении.

person Mike Seymour    schedule 16.08.2013
comment
Мне нравится выражение, застрявшее в прошлом :D :D - person Antonio; 16.08.2013

Добавлять:

const unsigned int mystruct::INVALID_VALUE = std::numeric_limits<unsigned int>::max();

где-то в файле cpp это обычный способ инициализации статических элементов.

person Crowman    schedule 16.08.2013