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

时间:2011-08-24 03:48:25

标签: c++

我似乎记得在将多个名称空间组合成一个名称的某个地方看到笔记。

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

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

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

我一直在寻找语法,或者只是将它们换成另一个名字 - 事后 - (是的,我知道我可以用嵌套的方式重写它)或者将它们合并到一个新的空间中。但是,我确实发现如果我添加到其中一个名称空间很多的话。

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
}

问题是:

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

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

3 个答案:

答案 0 :(得分:7)

你可以这样做:

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

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

答案 1 :(得分:6)

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

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

对于不冲突的名称,这种方式只能由c限定,您可以通过限定c::ac::b来解决冲突。

e.g:

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;
}

答案 2 :(得分:4)

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

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