有什么办法可以阻止命名空间在C++中添加更多的类吗?

1 c++ namespaces

我想创建一个命名空间,并阻止它添加任何更多的类或其他东西.我有什么方法可以实现这一点.

Lig*_*ica 20

  • 仅仅因为你不喜欢真相并不意味着这不是一个100%正确的答案.这也是少有的事情之一,没有任何进一步的用途.这是不可能的; 故事结局. (3认同)
  • 我想我们可能会对C++设计,命名空间和类的预期使用有所担忧,因此得出某些结论,为什么名称空间是开放的但是类是关闭的.但是问题并没有更好的回答,甚至可能不会让提问者感觉更好. (3认同)
  • 从[这里](http://stackoverflow.com/help/how-to-answer)*简洁是可以接受的,但更全面的解释更好.*详细说明,你可以做得比这更好,为什么你不能,你能提出什么建议吗?更好. (2认同)
  • 这是一个简单的是或否的问题; 我不明白为什么要求详细说明. (2认同)

Tem*_*Rex 8

@LightnessRacesinOrbit的答案由标准的以下引用解释

7.3命名空间[basic.namespace]

1命名空间是可选命名的声明性区域.命名空间的名称可用于访问在该命名空间中声明的实体; 也就是命名空间的成员.与其他声明性区域不同,命名空间的定义可以分为一个或多个转换单元的几个部分.

由于翻译单元的数量是一个开放集,因此可以添加名称空间成员资格.

但是,正如@Galik所建议的那样,通过仅使用静态成员函数编写结构或类,您可以不完美地模拟封闭的命名空间

struct closed_namespace {

static void fun() { /* bla */ }

};
Run Code Online (Sandbox Code Playgroud)

将命名空间转换为struct可能不是100%的插件.例如,普通名称查找可能行为相同,但您始终需要限定函数,以便ADL离开窗口.

但是调用代码几乎是一样的(即使用::访问器)

closed_namespace::fun();
Run Code Online (Sandbox Code Playgroud)

你还可以使用typedef缩短长名称,使用using类似于从左到右命名空间别名的C++ 11 -syntax

using cn = closed_namespace;
Run Code Online (Sandbox Code Playgroud)

另一方面,使用指令和声明不会延续.