Wie ändere ich den von einer Enumeration (C++) verwendeten Integer-Typ?
Lesezeit: 3 Minuten
Linuxios
Wenn ich eine C++-Aufzählung habe:
enum Foo
{
Bar,
Baz,
Bork,
};
Wie sage ich dem Compiler, dass er a verwenden soll? uint16_t um den Wert der Aufzählung tatsächlich zu speichern?
BEARBEITEN: Unterstützt GCC diese Funktion in seiner Implementierung von C++11?
@YochaiTimmer, Standard geändert und Thema auf dem Link sagt nichts aus enum class
– Lol4t0
24. März 2012 um 17:10 Uhr
@YochaiTimmer: Überhaupt nicht. Ich möchte wissen, ob ich enum ändern kann, um seine Werte intern mit a zu speichern uint16_tnicht ob es die gleiche Größe hat wie int.
– Linuxios
24. März 2012 um 17:14 Uhr
Nicol Bola
Dies ist in C++98/03 nicht möglich. C ++ 11 erlaubt Ihnen, dies zu tun, und ohneenum class die Art, wie alle anderen dir immer wieder sagen:
enum EnumType : uint16_t
{
Bar,
Baz,
Bork,
};
Auch hier müssen Sie nicht verwenden enum class. Nicht, dass es eine schlechte Idee wäre, aber Sie tun es nicht haben zu.
Unterstützt GCC diese Funktion in seiner Implementierung von C++11?
Welche GCC-Version? Es sieht so aus, als hätte GCC 4.4 diese Funktionalität hinzugefügt, aber Sie sollten wahrscheinlich nach neueren Versionen suchen, nur um der Stabilität willen.
Das habe ich mich auch schon gefragt. Der einzige Unterschied ist das enum class schafft einen neuen Geltungsbereich, wohingegen enum nicht.
– Chris
24. März 2012 um 17:26 Uhr
@chris: Nein, es gibt mehrere Unterschiede zwischen enum class und enum. Beide erstellen Bereiche (die obige Bar kann mit zugegriffen werden EnumType::Bar), sondern nur die class Ausführung Kräfte Sie die bereichsbezogene Aufzählung verwenden. Ebenfalls, enum class Variablen nicht implizit ganze Zahlen in den Aufzählungstyp umwandeln. Sie müssen also entweder einen tatsächlichen Enumerator des richtigen Typs übergeben oder eine explizite Umwandlung durchführen. Dies fügt ein viel mehr Typensicherheit.
– Nicol Bolas
24. März 2012 um 17:30 Uhr
Oh, ich habe meinen Standpunkt aus einer anderen Frage zu SO verstanden: stackoverflow.com/questions/441552/… Was Ihren zweiten Punkt betrifft, habe ich einfach noch nie davon gehört. Danke für das kostenlose Wissen 🙂
– Chris
24. März 2012 um 17:46 Uhr
Nawaz
In C++11 können Sie das tun:
enum class Foo : uint16_t
{
Bar,
Baz,
Bork,
};
Später können Sie auch den zugrunde liegenden Typ der Aufzählung kennen als:
#include <type_traits>
std::underlying_type<Foo>::type v = 10; //v is uint16_t
Mit c++11 hast du jetzt enum classmit dem Sie den zugrunde liegenden Typ explizit festlegen können:
enum class Foo: uint16_t
{
Bar,
Baz,
Bork,
};
Dietmar Kühl
Mit Pre-C++2011 können Sie einen Mindestspeicher erzwingen, indem Sie einen geeigneten Wertebereich verwenden:
enum foo {
v0 = 0,
vmax = 32767
};
Ich denke, der Compiler kann entweder ein Zeichen oder einen vorzeichenlosen Integer-Typ als zugrunde liegenden Typ auswählen. Der obige Bereich erzwingt, dass die Darstellung mindestens verwendet short als zugrunde liegende ganze Zahl. Wenn Sie es noch eins größer machen, kann es dazu führen, dass es verwendet wird long stattdessen. Dies erzwingt natürlich nur einen minimalen Bereich und der Compiler kann einen größeren Bereich frei wählen. Mit der obigen Definition dürfen Sie sich auch nicht außerhalb des Bereichs bewegen [0, 32767]: Wenn Sie wirklich (mindestens) einen 16-Bit-Bereich benötigen, müssen Sie entsprechende Werte verwenden).
13859400cookie-checkWie ändere ich den von einer Enumeration (C++) verwendeten Integer-Typ?yes
@YochaiTimmer, Standard geändert und Thema auf dem Link sagt nichts aus
enum class
– Lol4t0
24. März 2012 um 17:10 Uhr
@YochaiTimmer: Überhaupt nicht. Ich möchte wissen, ob ich enum ändern kann, um seine Werte intern mit a zu speichern
uint16_t
nicht ob es die gleiche Größe hat wieint
.– Linuxios
24. März 2012 um 17:14 Uhr