使用嵌套命名空间时,有时完全限定名称最终会很长。我知道我可以使用namespace abc = aaa::bbb::ccc
来减少打字量(在某些情况下也可能提高可读性)。
但是,我不确定在项目中的所有文件中实现此重命名的最佳方法是什么。直接的方法(即,在每次使用的基础上重命名长命名空间)可能导致最终为不同文件中的相同完全限定名称使用不同的短名称。所以,我正在考虑采用更加一致的方式来做到这一点。
例如,让我们假设:
project
|- client
| |- core
| |- plugin
| |- util
|- server
...
我打算为每个目录创建一个包含简化名称的标题。例如,project/client/core/core.h
将包含namespace pr_cl_core = project::client::core
(我知道这个简短名称的示例相当差,但在实际项目中它们更有意义)。然后,我将core.h
包含在project/client/core
中的所有头文件中,这样当包含该目录的头文件时,比如project/client/plugin/plugin_foo.h
,就可以使用短命名空间版本。
这是一个很好的方法吗?还有其他更好的方法吗?
我在SO上发现了几个关于C ++命名空间的问题(例如,1和2),但它们都没有涉及如何以项目范围的方式解决命名空间重命名问题。
编辑:此外,这种机制可用于系统地重命名整个项目的长名称空间(例如Boost的名称空间)。例如,我通常重命名一些名称空间,如:
namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;
目前我是按翻译单位进行此操作,但我希望使用全局方法来完成整个项目。
答案 0 :(得分:1)
我认为,如果您反复必须键入长命名空间名称,那么您的命名空间层次结构中就会出现问题。
假设您对类有相同的看法,反复找到自己键入obj->sub()->subsub()->some_method()
。这将违反Law of Demeter。对于类,您将重构代码(通过编写包装函数),以便层次结构中的类只需要访问一级方法。
使用命名空间也应该这样做:如果你必须调用project::client::core
,那么你应该在client
中编写包装函数/类来向project
公开必要的接口。如果您需要在整个地方执行此操作,为什么不展平您的命名空间结构,以便client
和core
处于同一级别?
Boost使用嵌套命名空间这一事实只是部分正确,因为大多数嵌套命名空间(如aux
和detail
都不应该由客户端调用。例如。 Boost.MPL是一个非常好的库的例子,小心不要无偿暴露嵌套的命名空间。