bet*_*ido 19 c++ namespaces hierarchy
使用嵌套命名空间时,有时完全限定名称最终会很长.我知道我可以用它namespace abc = aaa::bbb::ccc来减少打字量(在某些情况下它也可以提高可读性).
但是,我不确定在项目中的所有文件中实现此重命名的最佳方法是什么.直接的方法(即,在每次使用的基础上重命名长命名空间)可能导致最终在不同文件中为相同的完全限定名称使用不同的短名称.所以,我正在考虑采用更一致的方式来做到这一点.
例如,让我们假设:
project
|- client
| |- core
| |- plugin
| |- util
|- server
...
Run Code Online (Sandbox Code Playgroud)
我想为每个目录创建一个包含简化名称的标题.例如,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;
Run Code Online (Sandbox Code Playgroud)
目前我是按翻译单位进行的,但我希望使用全局方法来完成整个项目.
我认为,如果您必须反复输入长命名空间名称,那么您的命名空间层次结构中就会出现问题。
假设您对类也有同样的情况,反复发现自己正在输入obj->sub()->subsub()->some_method()。这违反了德墨忒尔法则。对于类,您可以重构代码(通过编写包装函数),以便层次结构中较低的类只需访问上一层的方法。
对于命名空间也应该这样做:如果您必须调用,project::client::core那么您应该编写包装器函数/类以client将必要的接口公开给project. 如果您需要在各处执行此操作,为什么不展平您的命名空间结构,使client和core处于同一级别呢?
Boost 使用嵌套命名空间的事实只部分正确,因为大多数嵌套命名空间(例如aux和 )detail不应该由客户端调用。例如,Boost.MPL 是一个非常好的库示例,它小心翼翼地避免无端暴露嵌套命名空间。
| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |