c++ - 有什么方法可以避免在没有命名空间污染的情况下在标头中完全指定的类名?
问题描述
我们有很多不在任何命名空间中的类,它们广泛使用 std。
例如:
class MyClass
{
std::map<std::string,std::vector<std::string>> mLookup
...
这很乏味,但因为它是我不能做的标题,using namespace std;
否则我会造成严重的污染。
我也不能(我认为)将这个类移动到一个新的命名空间中,而不必在代码库的其余部分中更新它的每一次使用,这一切都开始变得有点严肃了。
所以我想检查一下,C++(17)没有提供任何其他解决方案吗?我只需要完全指定事物或引入命名空间?
解决方案
不,如果您满足以下条件,则不必更改所有内容:
拥有一组您希望移动到特定命名空间的类
您的代码组织良好,这些类在它们自己的、不同的翻译单元中实现,与所有其他类分开。
唯一需要做的事情:
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::
”,而您甚至都没有意识到这一点,因此这将不再是问题。
推荐阅读
- python - 根据另一个 df 和 pandas 条件在 df 中添加新行
- php - 新的 Laravel vhost 下载 php 而不是执行,而现有的 vhost 可以工作
- java - 如何在java中为ListIterator编写JUnit测试以测试listiterator是否已设置为特定索引
- python - 神经网络实现中的内存不足(使用 Numpy 数组)。什么可以优化数据负载?
- regex - '$' 在 bash 中的正则表达式
- amazon-web-services - 云端 https 请求的 Aws S3 重定向规则问题
- xaml - Xamarin.Forms 为 WPF 嵌入本机控件
- android - Recyclerview中POJO和Retrieve的房间插入列表
- grails - OR 条件 Grails 嵌套对象
- android - 方法不会从其超类错误中覆盖方法