在C ++中重命名命名空间的一致方法

时间:2012-07-05 15:51:37

标签: c++ namespaces hierarchy

使用嵌套命名空间时,有时完全限定名称最终会很长。我知道我可以使用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 ++命名空间的问题(例如,12),但它们都没有涉及如何以项目范围的方式解决命名空间重命名问题。

编辑:此外,这种机制可用于系统地重命名整个项目的长名称空间(例如Boost的名称空间)。例如,我通常重命名一些名称空间,如:

namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;

目前我是按翻译单位进行此操作,但我希望使用全局方法来完成整个项目。

1 个答案:

答案 0 :(得分:1)

我认为,如果您反复必须键入长命名空间名称,那么您的命名空间层次结构中就会出现问题。

假设您对类有相同的看法,反复找到自己键入obj->sub()->subsub()->some_method()。这将违反Law of Demeter。对于类,您将重构代码(通过编写包装函数),以便层次结构中的类只需要访问一级方法。

使用命名空间也应该这样做:如果你必须调用project::client::core,那么你应该在client中编写包装函数/类来向project公开必要的接口。如果您需要在整个地方执行此操作,为什么不展平您的命名空间结构,以便clientcore处于同一级别?

Boost使用嵌套命名空间这一事实只是部分正确,因为大多数嵌套命名空间(如auxdetail都不应该由客户端调用。例如。 Boost.MPL是一个非常好的库的例子,小心不要无偿暴露嵌套的命名空间。