有什么方法可以避免 fully-specified class-names in a header 而没有命名空间污染?

Is there any way to avoid fully-specified class-names in a header without namespace pollution?

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

例如:

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

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

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

所以我想检查一下,C++(17) 提供任何其他解决方案吗?我只需要 fully-specify 东西或引入命名空间?

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

  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
}

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

P.S。几年后,您的手指将自动键入“std::”,而您甚至都没有意识到,所以这将不是问题。

进一步观察,简短的回答是:否。

您可以在头文件中定义的方法或函数中使用 using a::b::c,您当然可以在 .cpp 文件中使用名称空间,但是在不污染代码库的情况下无法在头文件中执行此操作。

正确的方法是将事物移动到命名空间中,但这个问题特别要求替代方案……似乎没有。编写新代码以避免将来出现此陷阱的教训"