有什么方法可以避免 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 东西或引入命名空间?
不,如果您满足以下条件,则不必更改所有内容:
有一个 类 的集合,您希望将其移入特定的命名空间
您的代码组织良好,那些 类 是在它们自己的、不同的翻译单元中实现的,与所有其他 类 分开。
唯一需要做的事情:
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 文件中使用名称空间,但是在不污染代码库的情况下无法在头文件中执行此操作。
正确的方法是将事物移动到命名空间中,但这个问题特别要求替代方案……似乎没有。编写新代码以避免将来出现此陷阱的教训"
我们有很多 classes 不在任何命名空间中,它们广泛使用 std。
例如:
class MyClass
{
std::map<std::string,std::vector<std::string>> mLookup
...
这很乏味,但因为它是一个 header 我不能只做 using namespace std;
否则我会造成严重的污染。
我(我认为)也不能将这个 class 移动到一个新的命名空间中,而不必更新代码库其余部分中对它的每次使用,这一切都开始变得有点严重了任务。
所以我想检查一下,C++(17) 不 提供任何其他解决方案吗?我只需要 fully-specify 东西或引入命名空间?
不,如果您满足以下条件,则不必更改所有内容:
有一个 类 的集合,您希望将其移入特定的命名空间
您的代码组织良好,那些 类 是在它们自己的、不同的翻译单元中实现的,与所有其他 类 分开。
唯一需要做的事情:
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 文件中使用名称空间,但是在不污染代码库的情况下无法在头文件中执行此操作。
正确的方法是将事物移动到命名空间中,但这个问题特别要求替代方案……似乎没有。编写新代码以避免将来出现此陷阱的教训"