En C ++, ¿qué es un “alias de espacio de nombres”?

¿Qué es un “alias de espacio de nombres” en C ++? ¿Cómo se usa?

Un alias de espacio de nombres es una forma conveniente de referirse a un nombre de espacio de nombres largo con un nombre diferente y más corto.

Como ejemplo, supongamos que desea utilizar los vectores numéricos de uBLAS de Boost sin using namespace una directiva de using namespace . Indicar el espacio de nombre completo cada vez es engorroso:

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

En su lugar, puede definir un alias para boost::numeric::ublas – digamos que queremos abreviar esto a solo ublas :

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

Simplemente, el #define no funcionará.

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

Comstack bien. Te permite trabajar en colisiones de nombre / nombre de clase.

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

En la última línea, “Hmm: Oops” es un error de comstackción. El pre-procesador lo cambia a Nope :: Vaya, pero Nope ya es un nombre de clase.

Más sobre este tema http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

Se trata de elegir un alias para un nombre de espacio de nombre looong, como por ejemplo:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

Luego, más adelante, puedes escribir def

typedef SHORT::mytype

en lugar de

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

Esta syntax solo funciona para espacios de nombres, no puede incluir clases, tipos después del namespace NAME =

También tenga en cuenta que los alias de espacio de nombres y las directivas de uso se resuelven en tiempo de comstackción, no en tiempo de ejecución. (Más específicamente, ambas herramientas se usan para indicar al comstackdor dónde buscar al resolver nombres, si no puede encontrar un símbolo particular en el ámbito actual o cualquiera de sus ámbitos principales). Por ejemplo, ninguno de estos comstackr:

 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; 

Ahora, una mente curiosa puede haber notado que constexpr variables constexpr también se usan en tiempo de comstackción y se preguntan si se pueden usar junto con un alias o una directiva. Que yo sepa, no pueden, aunque puedo estar equivocado acerca de esto. Si necesita trabajar con variables con nombres idénticos en diferentes espacios de nombres, y elegir entre ellas dinámicamente, tendría que usar referencias o punteros.

 // 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; } } 

La utilidad de lo anterior puede ser limitada, pero debe servir para el propósito.

(Mis disculpas por cualquier error que haya echado de menos en los párrafos anteriores).