首页 > 解决方案 > 有什么方法可以避免在没有命名空间污染的情况下在标头中完全指定的类名?

问题描述

我们有很多不在任何命名空间中的类,它们广泛使用 std。

例如:

class MyClass
{
std::map<std::string,std::vector<std::string>> mLookup
...

这很乏味,但因为它是我不能做的标题,using namespace std;否则我会造成严重的污染。

我也不能(我认为)将这个类移动到一个新的命名空间中,而不必在代码库的其余部分中更新它的每一次使用,这一切都开始变得有点严肃了。

所以我想检查一下,C++(17)没有提供任何其他解决方案吗?我只需要完全指定事物或引入命名空间?

标签: c++stl

解决方案


不,如果您满足以下条件,则不必更改所有内容:

  1. 拥有一组您希望移动到特定命名空间的类

  2. 您的代码组织良好,这些类在它们自己的、不同的翻译单元中实现,与所有其他类分开。

唯一需要做的事情:

A)在您的头文件中,只需将类移动到它们自己的命名空间声明中:

#ifndef myclass_h
#define myclass_h

namespace app {   // start of namespace declaration
#if 0
}
#endif

class MyClass {
public:
    MyClass();

// ...

#if 0
{
#endif
}          // End of namespace declaration

#endif

这个预处理器技巧甚至消除了重新缩进所有内容的需要,并且愚弄了语法感知代码编辑器,使其不添加额外的缩进级别。对移植到新命名空间中的其他类的所有引用MyClass也会一起更新(前提是它们的头文件以相同的方式调整)。

B) 最后,每个翻译单元都会做同样的事情。

#include "myclass.H"

namespace app {
#if 0
}
#endif

MyClass::MyClass()
{
   /// ...


#if 0
{
#endif
}

现在,只需键入几分钟,您就可以将一堆类移动到一个新的命名空间中。

PS 几年后,您的手指会自动输入“ std::”,而您甚至都没有意识到这一点,因此这将不再是问题。


推荐阅读