19

使用嵌套命名空间时,有时完全限定名称会变得很长。我知道我可以用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;

目前我在每个翻译单元的基础上执行此操作,但我想对整个项目使用全局方法来执行此操作。

4

1 回答 1

1

我会争辩说,如果您反复输入长名称空间名称,那么您的名称空间层次结构中有问题。

假设你对类也有同样的情况,反复发现自己在打字obj->sub()->subsub()->some_method()。这将违反得墨忒耳法则。在类的情况下,您将重构您的代码(通过编写包装函数),以便层次结构中的下级类只需要访问上一级的方法。

命名空间也应该这样做:如果您必须调用,project::client::core那么您应该编写包装函数/类client以将必要的接口公开给project. client如果您需要在所有地方执行此操作,为什么不扁平化您的命名空间结构,以便core它们处于同一级别?

Boost 使用嵌套命名空间的事实只是部分正确,因为大多数嵌套命名空间都喜欢aux并且detail不应该被客户端调用。例如,Boost.MPL 是一个非常好的库示例,它注意不要无缘无故地暴露嵌套的命名空间。

于 2012-07-06T11:51:50.170 回答