2013-07-24 13 views
5

Mam enum tak: (Faktycznie, jest to klasa enum)typedef i enum lub enum class

enum class truth_enum { 
    my_true = 1, 
    my_false = 0 
}; 

Chciałbym móc wystawiać my_true do globalnej przestrzeni nazw, tak, że mogę zrobić to:

char a_flag = my_true; 

Albo przynajmniej:

char a_flag = (char)my_true; 

zamiast tego:

char a_flag = truth_enum::my_true; 

Czy to możliwe?

Próbowałem coś takiego:

typedef truth_enum::my_true _true_; 

otrzymuję błąd: my_true w klasie enum truth_enum nie nazwę typu

Domyślam się, że to nie my_true wartość typu. Czy istnieje alternatywa, którą mogę zrobić, aby włączyć tę funkcję w moich programach?

Nie idealne, ale mogę zrobić coś takiego:

enum class : const char { ... }; 
const char const_flag_false = truth_enum::my_false; 

Hmm ...

+0

jeśli używasz klasy enum, nie możesz uniknąć pisania prefiksu. gadatliwość nie stanowi problemu, chyba że utrudnia czytelność. – yngccc

+0

Moduł wyliczający "klasę enum" nie pośrednio konwertuje na liczbę całkowitą, a więc 'char a_flag = my_true;' i tak jest źle. –

+0

Użyłem konwersji powyżej – user3728501

Odpowiedz

1

usuwanie class z definicji enum. Zakładam, że jesteś obrażony przez niejawną konwersję na int. Jak o:

static constexpr truth_enum _true_ = truth_enum::my_true; 
static constexpr truth_enum _false_ = truth_enum::my_false; 

lub po prostu

const truth_enum _true_ = truth_enum::my_true; 
const truth_enum _false_ = truth_enum::my_false; 
+0

OK Zajrzę do tej sekundy Potrzebuję naprawić swój kod, podczas gdy pamiętam – user3728501

+0

Co robi static contexpr? Co właściwie robi contexpr? – user3728501

+0

'constepxr' zastosowany do zmiennej czyni' const' i zmusza kompilator do obliczenia jego inicjalizatora w czasie kompilacji. W tym konkretnym przypadku jest to w zasadzie identyczne z "const" - prawdopodobnie nadużywam nowatorskiej konstrukcji w miejscach, w których działa, ale nie jest to konieczne. – Casey

0

Rozwiązanie było łatwe, błąd zrobiłem było wykorzystanie enum class zamiast wyliczenia.

Tak, więc jeszcze trochę zdezorientowany faktycznie - Mogę teraz wystarczy użyć wartości takich jak:

bool aboolean = (bool)my_true; 

Zamiast to zrobić:

bool aboolean = (bool)truth_enum::my_true; 

Dlaczego tak jest? (Utworzono wiki społeczności, aby ludzie mogli edytować ...)

+0

Wyliczenia w C++ dziedziczą z C, gdzie jest to po prostu preprocesorowe makro. Jest więc widoczny w globalnej przestrzeni nazw. –