我似乎记得在将多个名称空间合并为一个的方法中的某处.
现在,寻找所说的笔记我找不到它们 - 甚至使用搜索术语进行搜索,分组,合并和包装我都没有想出任何东西.也许我误解了之前看到过的东西. 我没有具体的应用程序,这只是一种好奇心而且有点做作.
但是,从两个名称空间开始......
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)是否有一种语法来包装空格而不向子空间添加更多内容?
你可以这样做:
namespace c
{
using namespace a;
using namespace b;
}
Run Code Online (Sandbox Code Playgroud)
但是如果a和b具有相同名称的元素,则无法在命名空间c中使用它们.
自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)
您可以像这样将命名空间包装在一个新的命名空间中:
namespace c {
namespace a { using namespace ::a; }
namespace b { using namespace ::b; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |