缩短嵌套的命名空间名称

big*_*hil 6 c++ namespaces

如果使用嵌套命名空间,则头文件中的声明可能会变得非常长且不可读.

//header1
namespace test { namespace test1 {
class Test {};
} } //namespace
Run Code Online (Sandbox Code Playgroud)

在程序的header2中:

#include "header1"

namespace test2 {

class Test1 {
  void test(test::test1::Test &test) {}
  void test1(test::test1::Test &test) {}
  void test2(test::test1::Test &test1, test::test1::Test &test2) {}
};

}
Run Code Online (Sandbox Code Playgroud)

是否有可能缩短header2中的名称?

Omn*_*ous 6

这是我最喜欢的技术:

#include "header1"

namespace test2 {

class Test1 {
 private:
  typedef ::test::test1::Test MeaningfulName;

  void test(MeaningfulName &test) {}
  void test1(MeaningfulName &test) {}
  void test2(MeaningfulName &test1, MeaningfulName &test2) {}
};

}
Run Code Online (Sandbox Code Playgroud)

我将typedef别名设为私有,但我将它们放在类声明的开头.它们对程序的其余部分是私有的并不重要,因为没有人会使用别名,他们将使用实际的类型名称或他们自己的名称别名.

我也非常喜欢使用锚定的命名空间名称以避免以后的意外.我的规则是我总是使用一个锚定的名称,除非名称空间是我控制的名称和/或是当前项目或包的一部分或其他.然后我将使用最短的相对名称.如果该相对名称将从根命名空间开始,我仍然经常使用锚定名称.

主要问题是<:一旦你开始更频繁地使用锚定名称,将会在模板声明中突然出现的有向图.你必须放置一个空间来避免它,特别是因为有向图处理在很早的阶段发生,并且可以给你一些非常奇怪的错误消息.