Как изменить целочисленный тип, используемый перечислением (C ++)? - PullRequest
20 голосов
/ 24 марта 2012

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

enum Foo
{
  Bar,
  Baz,
  Bork,
};

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

РЕДАКТИРОВАТЬ: GCCподдерживать эту функцию в реализации C ++ 11?

Ответы [ 4 ]

28 голосов
/ 24 марта 2012

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

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

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


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

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

15 голосов
/ 24 марта 2012

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

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

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

#include <type_traits> 

std::underlying_type<Foo>::type v = 10; //v is uint16_t
5 голосов
/ 24 марта 2012

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

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

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

5 голосов
/ 24 марта 2012

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

enum class Foo: uint16_t 
{ 
   Bar,
   Baz,
   Bork,
}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...