2011-08-24 19 views
5

Parece que recuerdo haber visto notas en alguna parte de una manera de combinar múltiples espacios de nombres en uno solo.¿Es posible envolver o fusionar espacios de nombres separados?

Ahora, en busca de dichas notas, no las encuentro, incluso buscando utilizando términos de búsqueda peinando, agrupando, fusionando y envolviendo No se me ocurre nada. Tal vez no entendí lo que vi antes. No tengo una aplicación específica para esto, es solo una curiosidad y es un poco artificial.

Pero, a partir de dos espacios de nombres ...

namespace a {int func() {return 1;}} 
namespace b {int func() {return 2;}} 

que estaba buscando a la sintaxis ya sea simplemente envolverlos en otro nombre - después del hecho - (sí, sé que puedo reescribirlo de forma anidada) o combinarlos en un nuevo espacio. Pero encontré que si agrego uno de los espacios de nombres que funciona mucho.

namespace c {namespace a{ int func2() {return 3;}} } 


int main(int argc, char **argv) 
{ 
    int a = a::func();   // normal case 
    int c = c::a::func2();  // wrapped and added to 

    //int c = c::func2();  // doesn't work 
    //int d = a::func2();  // doesn't work 
} 

La pregunta son:

1) ¿hay sintaxis que simplemente combina los dos espacios en uno nuevo?

2) ¿hay una sintaxis para envolver los espacios sin agregar más a los subespacios?

+1

supongo que se podría poner 'using namespace a;' 'en b' pero la superposición de nombres de funciones pueden causar problemas. – GWW

+0

¿cuál sería el objetivo de esto? – Rhexis

+0

@Flyphe - para citar la pregunta anterior: * No tengo una aplicación específica para esto, es solo una curiosidad y es un poco artificial. * – Arbalest

Respuesta

6

Usted puede hacer esto:

namespace c 
{ 
    using namespace a; 
    using namespace b; 
} 

Pero si A y B tienen elementos con los mismos nombres, usted no será capaz de utilizarlas del espacio de nombres c.

+0

Gracias. Para dejar una nota para quienes puedan ver esto más adelante, la sintaxis de uso es: 'int a = c :: func(); 'Ver otra respuesta para cuando hay conflictos de nombres. – Arbalest

4

Puede envolver los espacios de nombres en un nuevo uno como este:

namespace c { 
    namespace a { using namespace ::a; } 
    namespace b { using namespace ::b; } 
} 
+0

Esta es una solución igualmente buena. Requiere un poco más de tipeo para calificar los nombres, pero podría ser algo bueno, especialmente si los nombres en los subespacios entran en conflicto 'int a = c :: a :: func();' – Arbalest

5

La mejor solución ya que C++ 11 es:

namespace c 
{ 
    inline namespace a { using namespace ::a; } 
    inline namespace b { using namespace ::b; } 
} 

De esta manera los nombres que no entren en conflicto puede calificar solo por c y puede resolver conflictos calificando c::a o c::b.

ej .:

namespace a 
{ 
    auto foo_a() { cout << "a::foo_a" << endl; } 
    auto foo() { cout << "a::foo" << endl; } 
} 
namespace b 
{ 
    auto foo_b() { cout << "b::foo_b" << endl; } 
    auto foo() { cout << "b::foo" << endl; } 
} 

namespace c 
{ 
    inline namespace a { using namespace ::a; } 
    inline namespace b { using namespace ::b; } 
} 

int main() 
{ 
    c::foo_a(); 
    c::foo_b(); 

    c::a::foo(); 
    c::b::foo(); 

    return 0; 
} 
Cuestiones relacionadas