que - En C++, ¿qué es un "alias de espacio de nombres"?
use namespace php (4)
¿Qué es un "alias de espacio de nombres" en C ++? ¿Cómo se usa?
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 sintaxis solo funciona para espacios de nombres, no puede incluir clases, tipos después del namespace NAME =
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; } }; }
Compila 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.
También tenga en cuenta que los alias de espacio de nombres y las directivas de uso se resuelven en tiempo de compilación, no en tiempo de ejecución. (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 compilar:
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 compilació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).
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<double> 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<double> v;