可以包装或合并单独的命名空间吗?

Arb*_*est 5 c++

我似乎记得在将多个名称空间合并为一个的方法中的某处.

现在,寻找所说的笔记我找不到它们 - 甚至使用搜索术语进行搜索,分组,合并和包装我都没有想出任何东西.也许我误解了之前看到过的东西. 我没有具体的应用程序,这只是一种好奇心而且有点做作.

但是,从两个名称空间开始......

namespace a {int func() {return 1;}}
namespace b {int func() {return 2;}}
Run Code Online (Sandbox Code Playgroud)

我正在寻找语法,或者简单地用另一个名字包装它们 - 事实之后 - (是的,我知道我可以用嵌套的方式重写它)或者将它们合并到一个新的空间中.但是,我确实发现如果我添加到其中一个名称空间有用的话.

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
}
Run Code Online (Sandbox Code Playgroud)

问题是:

1)是否有将两个空格合并为一个新空格的语法?

2)是否有一种语法来包装空格而不向子空间添加更多内容?

Ben*_*ley 7

你可以这样做:

namespace c
{
    using namespace a;
    using namespace b;
}
Run Code Online (Sandbox Code Playgroud)

但是如果a和b具有相同名称的元素,则无法在命名空间c中使用它们.


bol*_*lov 6

自C++ 11以来的最佳解决方案是:

namespace c
{
    inline namespace a { using namespace ::a; }
    inline namespace b { using namespace ::b; }
}
Run Code Online (Sandbox Code Playgroud)

对于不冲突的名称,这种方式只能通过限定c,您可以通过限定c::a或解决冲突c::b.

例如:

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;
}
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 5

您可以像这样将命名空间包装在一个新的命名空间中:

namespace c {
    namespace a { using namespace ::a; }
    namespace b { using namespace ::b; }
}
Run Code Online (Sandbox Code Playgroud)