¿Qué es un "alias de espacio de nombres" en C++? ¿Cómo se usa?En C++, ¿qué es un "alias de espacio de nombres"?
Respuesta
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;
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.
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 =
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.)
- 1. ¿Es posible revertir alias un espacio de nombres C#?
- 2. Convenciones de alias de tipo/espacio de nombres en C#
- 3. ¿Qué es un espacio de nombres?
- 4. C# Espacio de nombres Alias calificador (: :) vs Desreferencia Operador (.)
- 5. ¿Cuál es el alcance de un alias de espacio de nombres en C++?
- 6. Alias de espacio de nombres C++ y declaración directa
- 7. ¿Cuál es el beneficio de usar alias de espacio de nombres en C#?
- 8. Crear un alias a otro espacio de nombres Clojure
- 9. ¿Está 'usando el espacio de nombres' dentro de otro espacio de nombre equivalente a un alias?
- 10. alias de espacio de nombres acortados en aspx
- 11. Alias del espacio de nombres de C#: ¿cuál es el punto?
- 12. ¿Por qué no podemos declarar alias de espacio de nombres dentro de una clase?
- 13. Problemas del ámbito del alias del espacio de nombres
- 14. C++ Espacio de nombres pregunta
- 15. Constante de espacio de nombres en C#
- 16. Problema de espacio de nombres en C++
- 17. Espacio de nombres enfrentadas en C++
- 18. Espacio de nombres con ámbito alias para tipos genéricos en C#
- 19. ¿Para qué se usa el espacio de nombres en C++?
- 20. ¿Por qué los métodos de extensión no funcionan con alias de espacio de nombres?
- 21. En C#, ¿por qué "int" es un alias para System.Int32?
- 22. Averigüe el URI de espacio de nombres predeterminado de un documento XML en C#
- 23. "plantillas" un espacio de nombres
- 24. Rendimiento entre la importación de espacio de nombres completo en comparación con el uso de alias en C#?
- 25. ¿Cómo hacer que el operador alias del espacio de nombres :: funcione bajo C#?
- 26. C++ Espacio de nombres dolores de cabeza
- 27. Aliasing de espacio de nombres en F #?
- 28. plantilla especializada en un espacio de nombres
- 29. C#: ¿Puedes dividir un espacio de nombres en varios archivos?
- 30. ¿Es posible crear un espacio de nombres en jQuery?
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. –
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? –
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 –