我似乎记得在将多个名称空间组合成一个名称的某个地方看到笔记。
现在,寻找所说的笔记我找不到它们 - 甚至使用搜索术语进行搜索,分组,合并和包装我不会想出任何东西。也许我误解了之前看到过的东西。 我没有特定的应用程序,这只是一种好奇心而且有点人为。
但是,从两个名称空间开始......
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)是否有一种语法来包装空格而不向子空间添加更多内容?
答案 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::a
或c::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; }
}