2017-06-21 1 views
3

Hier ist ein Code-Snippet, um meine Frage zu demonstrieren.C++ using-declaration with enums: Wie importiert man alle enum-Einträge?

namespace N{ 
    enum E { A, B, C, D }; 
} 

int main(){ 
    using N::E; 
    E e = A; // syntax error: 'A' is not declared 
} 

Die letzte Zeile gibt mir einen Syntaxfehler. Ich möchte die Namen N::A, N::B, N::C und N::D in der Hauptfunktion ohne den Namensraum Qualifier N:: verwenden. Aber ich nicht wollen die folgenden zwei Dinge tun

(1) Ich will nicht using namespace N sagen, denn das alles andere in N.

(2) I don importieren würde will nicht sagen using N::A, using N::B, etc für jedes Mitglied der enum. Wenn ich dann die Enumeration modifizieren will, muss ich auch meine Hauptfunktion ändern. Ganz zu schweigen davon, dass das zusätzliche Tippen mühsam und fehleranfällig ist.

Ich versuchte selbst eine Antwort zu suchen, konnte aber nicht. Jede Hilfe wird geschätzt.

Antwort

6

Wenn Sie den Header ändern können, wo E definiert ist, eine inline namespace versuchen.

namespace N { 
    inline namespace Enums { 
     enum E { A, B, C, D }; 
    } 
} 

int main() { 
    using namespace N::Enums; 
    E e = A; 
} 

Alle Namen im Inline-Namespace sind sichtbar in der einschließenden Namespace N, als ob der Inline-Namespace nicht da waren, aber dies ermöglicht es Ihnen, alle Namen zu importieren, und nur die Namen, die Sie wollen.

+0

Nun, das ist schlau! –

+0

@aschelpler Ihre Antwort scheint eine Lösung für mein Problem zu sein. Ich frage mich, was das Inline-Schlüsselwort mit einem Namespace tut. Ich habe versucht, den Code ohne Inline zu kompilieren und das funktioniert gut. – HazySmoke

+1

Ohne 'inline' können Sie nicht mehr' N :: E' oder 'N :: A' in einem Kontext sagen, in dem richtlinien nicht verwendet werden. Ich dachte, du würdest nicht alle zwingen wollen, es zu benutzen. – aschepler

0

Verwenden Sie einen qualifizierten Namen

E e = E::A; 

Zum Beispiel

namespace N { 
    enum E { A, B, C, D }; 
} 

int main() 
{ 
    using N::E; 
    E e = E::A; 

    return 0; 
} 
+0

@Amadeus Ich denke, er möchte den Namen des Namensraums nicht mit Enumeratoren verwenden. –

+0

@Amadeus Er machte einen Tippfehler. E ist kein Namensraum :) –

+1

Danke Amadeus. Ich würde dasselbe sagen. Ich frage mich, ob es einen anderen Weg gibt als den, den ich für (1) und (2) in meiner Frage erwähnt habe. – HazySmoke