Как изменить целочисленный тип, используемый enum (С++)? - программирование
Подтвердить что ты не робот

Как изменить целочисленный тип, используемый enum (С++)?

Если у меня есть перечисление С++:

enum Foo
{
  Bar,
  Baz,
  Bork,
};

Как сообщить компилятору использовать uint16_t для фактического хранения значения перечисления?

EDIT: поддерживает ли GCC эту функцию при реализации С++ 11?

4b9b3361

Ответ 1

Вы не можете сделать это в С++ 98/03. С++ 11 позволяет вам это делать и без enum class, как все говорят вам все:

enum EnumType : uint16_t
{
  Bar,
  Baz,
  Bork,
};

Опять же, вам не нужно использовать enum class. Не то, чтобы это была плохая идея, но вам это не нужно.


Поддерживает ли GCC эту функцию в своей реализации С++ 11?

Какая версия GCC? Похоже, что GCC 4.4 добавила эту функциональность, но вы, вероятно, должны смотреть на более свежие версии, только ради нее стабильности.

Ответ 2

В С++ 11 вы можете сделать это:

enum class Foo : uint16_t 
{
  Bar,
  Baz,
  Bork,
};

Позже вы также можете узнать базовый тип перечисления как:

#include <type_traits> 

std::underlying_type<Foo>::type v = 10; //v is uint16_t

Ответ 3

С c++11 теперь у вас enum class, который позволяет явно указать базовый тип:

enum class Foo: uint16_t 
{ 
   Bar,
   Baz,
   Bork,
}; 

Ответ 4

С pre-С++ 2011 вы можете заставить минимальное хранилище использовать подходящий диапазон значений:

enum foo {
    v0 = 0,
    vmax = 32767
};

Я думаю, что компилятор может выбрать либо знак, либо целое число без знака в качестве базового типа. В приведенном выше диапазоне было установлено, что в представлении используется как минимум short как его основное целое число. Сделать его еще одним большим может заставить его использовать long вместо этого. Конечно, это только заставляет минимальный диапазон, и компилятор может выбрать более широкий диапазон. Кроме того, с приведенным выше определением вам не разрешается отклоняться от диапазона [0, 32767]: если вам действительно нужен 16-битный диапазон (по крайней мере), вам нужно использовать соответствующие значения).