2008-11-26 15 views
7

Zastanawiam się w C++, czy mam wyliczenie mogę uzyskać dostęp do wartości na drugim indeksie? Na przykład mamEnum C++ Get by Index

enum Test{hi, bye}; 

jeśli chcę „cześć”, mogę zrobić coś takiego testu [0], dzięki.

+0

Nie. Ale jeśli podajesz przypadek użycia, mogą istnieć dobre alternatywy. –

Odpowiedz

1

Wylicza nazwy map na wartości. W twoim przypadku, (int) hi będzie mieć wartość 0, a (int) bye wartość 1. Można użyć obsady, aby uzyskać wartość Max:

int myInteger = 0; 
Test myValue = (Test)myInteger; 

Uwaga jednak, że myValue może być nieprawidłową wartością wyliczeniową, jeśli myInteger jest poza zakresem.

0

Nie, ale można przesyłać z int

Test test = (Test)0; 
+0

To bardzo zły pomysł, ponieważ nie masz gwarancji, że te wartości są prawidłowymi indeksami. –

0

Najlepszym rozwiązaniem może być coś takiego:

enum Test{hi = 0, bye}; 

Następnie można po prostu odnosi się do „cześć” z numerem 0, a 'bye' z 1.

Chociaż to naprawdę pokonuje cały cel używania wyliczenia w pierwszej kolejności.

17

Tak i nie. Jeśli Twój Enum nie ma wyraźnych wartości, to jest to możliwe. Bez wartości jawnych wartości wyliczeniowe otrzymują wartości liczbowe 0-N w kolejności deklaracji. Na przykład ...

enum Test { 
    hi, // 0 
    bye // 1 
} 

Oznacza to, że indeksy po prostu przekładają się na wartość dosłowną.

Test EnumOfIndex(int i) { return static_cast<Test>(i); } 

To oczywiście robi 0 sprawdzanie w czasie rzeczywistym i jak najszybciej dodać wyraźną wartość będzie się załamać. Ale zadziała w domyślnym scenariuszu.

5

O ile nie określono inaczej, wyliczanie rozpoczyna numerację o wartości 0 i zwiększa o 1 pozycję.

enum Test 
{ 
    hi, //0 
    bye, //1 
    count //2 
} 

Można rzucać int do typu wyliczenia, aby uzyskać żądaną wartość, takich jak:

(Test)0; 
//or 
Test(0); 

który pozwala robić takie rzeczy jak:

for(int i = 0; i < count; i++) 
{ 
    DoSomething((Test)i); 
} 
+6

Użyj static_cast (i) zamiast (Test) i – jab

1

Depends co rozumiesz przez "chcę" cześć ".

Jeśli masz na myśli, że chcesz mieć wartość, możesz ją uzyskać, rzucając int, jak powiedzieli inni.

Rzucanie literału numerycznego do typu wyliczeniowego zwykle nie ma sensu - jeśli wiesz, której wartości się spodziewasz, możesz użyć nazwy. W ten sposób enum może się zmienić bez naruszania kodu. Sądzę, że możliwe jest, że dzieje się coś naprawdę dziwnego, w którym ktoś stworzył enum i udokumentował, co oznacza "3", ale nie to, jaką to jest wartość. Ale wtedy chcesz naprawić API.

Przesyłanie wartości całkowitych znanych w środowisku wykonawczym do wyliczenia może być pomocne, jeśli masz dane w postaci szeregowej. Dopóki wiesz, że znajduje się w zasięgu enum, wynik jest zdefiniowany.

Jeśli masz na myśli ciąg "cześć", to nie możesz go mieć. W odróżnieniu od języka Java, w C++ nazwy wartości w typach wyliczeniowych istnieją tylko w czasie kompilacji, a nie w środowisku wykonawczym i tylko mapują w jednym kierunku.

0

Jeśli poza wartością zwracaną jako {Cześć lub do widzenia}, nie można uzyskać takiej wartości.

Nie polecam to zrobić inorder, aby uzyskać rzeczywistą wartość, ale może być stosowany jako włamać

string return_value(int index) 
{ 
string temp = ""; 
switch (index) 
{ 
case 1: temp = "hi" 
break; 
case 2: temp = "bye"; 
break; 
defualt : 
break; 
} 
return temp; 
} 

rzutowania do wyliczenia by ponownie powrócić indeks ale można przypisać do jakiegoś innego enum zmiennej