In C ++, che cos’è un “alias namespace”?

Che cosa è un “alias del namespace” in C ++? Come viene usato?

Un alias di namespace è un modo conveniente di riferirsi a un nome di namespace lungo con un nome diverso e più corto.

Ad esempio, supponiamo di voler utilizzare i vettori numerici di uBLAS di Boost senza using namespace direttiva using namespace . Dichiarare ogni volta lo spazio dei nomi completo è ingombrante:

 boost::numeric::ublas::vector v; 

Invece, puoi definire un alias per boost::numeric::ublas – diciamo che vogliamo abbreviare questo valore solo a ublas :

 namespace ublas = boost::numeric::ublas; ublas::vector v; 

Molto semplicemente, #define non funzionerà.

 namespace Mine { class MyClass { public: int i; }; } namespace His = Mine; namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; } 

Compila bene. Ti consente di aggirare le collisioni di nomi / classi.

 namespace Nope { class Oops { public: int j; }; } #define Hmm Nope namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; } 

Sull’ultima riga, “Hmm: Oops” è un errore di compilazione. Il pre-processore lo cambia in Nope :: Oops, ma Nope è già un nome di class.

Maggiori informazioni su questo argomento http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

Si tratta di scegliere un alias per un nome dello spazio dei nomi troppo lungo, ad esempio:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

Successivamente, puoi digitare typedef

typedef SHORT::mytype

invece di

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

Questa syntax funziona solo per gli spazi dei nomi, non può includere classi, tipi dopo lo namespace NAME = dei namespace NAME =

Si noti inoltre che gli alias dei nomi e le direttive di utilizzo vengono risolti in fase di compilazione, non in fase di esecuzione. (Più in particolare, sono entrambi gli strumenti utilizzati per dire al compilatore dove altro da guardare quando risolvono i nomi, se non riesce a trovare un particolare simbolo nell’attuale ambito o in uno qualsiasi dei suoi ambiti genitore.) Ad esempio, nessuno di questi compilare:

 namespace A { int foo; namespace AA { int bar; } // namespace AA namespace AB { int bar; } // namespace AB } // namespace A namespace B { int foo; namespace BA { int bar; } // namespace BA namespace BB { int bar; } // namespace BB } // namespace B bool nsChooser1, nsChooser2; // ... // This doesn't work. namespace C = (nsChooser1 ? A : B); C::foo = 3; // Neither does this. // (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.) if (nsChooser1) if (nsChooser2) using namespace A::AA; else using namespace A::AB; else if (nsChooser2) using namespace B::BA; else using namespace B::BB; 

Ora, una mente curiosa potrebbe aver notato che constexpr variabili di constexpr sono anche usate in fase di compilazione e si chiedono se possano essere usate in congiunzione con un alias o una direttiva. Per quanto ne so, non possono, anche se potrei sbagliarmi. Se è necessario lavorare con variabili con nomi identici in spazi dei nomi diversi e scegliere tra loro dynamicmente, è necessario utilizzare riferimenti o puntatori.

 // Using the above namespaces... int& foo = (nsChooser1 ? A::foo : B::foo); int* bar; if (nsChooser1) { if (nsChooser2) { bar = &A::AA::bar; } else { bar = &A::AB::bar; } } else { if (nsChooser2) { bar = &B::BA::bar; } else { bar = &B::BB::bar; } } 

L’utilità di quanto sopra può essere limitata, ma dovrebbe servire allo scopo.

(Le mie scuse per eventuali errori di battitura che potrebbero essermi persi in quanto sopra.)

Lo spazio dei nomi viene utilizzato per prevenire conflitti di nome.

Per esempio:

 namespace foo { class bar { //define it }; } namespace baz { class bar { // define it }; } 

Ora hai due barre dei nomi delle classi, che sono completamente diverse e separate grazie al namespaces.

Lo “spazio dei nomi che usi” che mostri è così che non devi specificare lo spazio dei nomi per usare le classi all’interno di quel namespace. cioè std :: string diventa string.

la mia risorsa: https://www.quora.com/What-is-namespace-in-C++-1