2009-07-31 22 views

Respuesta

149

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 una directiva using namespace. Que indica el espacio de nombres completa cada vez es engorroso:

boost::numeric::ublas::vector<double> v; 

En cambio, se puede definir un alias para boost::numeric::ublas - decimos que queremos para abreviar esta a solo ublas:

namespace ublas = boost::numeric::ublas; 


ublas::vector<double> v; 
+7

Para explicar posiblemente los votos a la baja, SO no es ni será un reemplazo para un buen libro de texto en C++. La pregunta que planteaste será respondida por dicho libro. Y la "característica" SO de responder sus propias preguntas no debe usarse para proporcionar paráfrasis de dichos libros. –

+16

Sin ofender ... Solo para explicar por qué lo hice: entendí por los comentarios de Joel en el podcast que incluso las preguntas de "nivel de entrada" eran legítimas en SO, y que era aceptable hacer una pregunta y responder usted mismo si ese contenido no estaba en SO todavía en una forma accesible. Pero aparentemente, esto está mal visto? –

+1

Definitivamente hay una etiqueta para responder a su propia pregunta, para evitar la irritación; en este caso, es bastante obvio que nunca ** fue ** una pregunta real. Por ejemplo, http://stackoverflow.com/questions/494927/stack-overflow-etiquette-for-answering-your-ow-question –

6

En pocas palabras, la #define no funcionará

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

Compilar 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 compilación. El pre-procesador lo cambia a Nope :: Vaya, pero Nope ya es un nombre de clase.

+0

Tan simple pero incómodo al mismo tiempo ...;) – Hermes

+2

¿Qué #define? Tal vez su respuesta se refiere a una versión anterior de la pregunta? – einpoklum

1

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 la elección de un alias para un nombre de espacio de nombres looong, tales como:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

Luego, más tarde, puede typedef

typedef SHORT::mytype

en lugar de

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

Esta sintaxis sólo funciona para los espacios de nombres, no puede incluir clases, tipos después de la namespace NAME =

1

También tenga en cuenta que los alias de espacio de nombres y el uso de directivas se resuelven en tiempo de compilación, no correr el tiempo. (Más específicamente, ambas herramientas se usan para indicar al compilador 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 Recopilar:

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 las variables se utilizan también en tiempo de compilación, y se preguntan si se pueden utilizar en combinación con cualquiera de 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 cumplir su función.

(Mis disculpas por cualquier tipo de error que me haya pasado por alto en lo anterior.)

Cuestiones relacionadas