处理 headers 中令人痛苦的长命名空间名称

Dealing with painfully long namespace names in headers

对于需要在 header 文件中引用的 looong 符号,有什么可以做的吗? ABDEFGHIJ::ZXCBVB::AWEDADSDEM::GFGBKGDF::Tools::Item?我知道在 header 文件中你不应该使用 using 因为它会弄乱任何包含它的人。

我什至能想到的唯一可以自行清理的有效功能是 #define+#undef,但这看起来很糟糕。

是否有我不知道的解决此问题的新功能?我也对任何受欢迎的提案感兴趣。也许 using 带有括号块语法,让我将效果限制在我的 header...?

你可以namespace aliases:

namespace fbz = foo::bar::baz;

但是,您会将 fbz 引入每个包含您的 header 的文件。

这是我的感受。

首先,您应该创建自己的 命名空间。然后你可以在不污染全局命名空间的情况下绘制其他命名空间符号。

如果您访问的命名空间确实庞大(如std)那么我会总是要么使用std:: 限定符或显式声明类型:

namespace my_project {

std::string s; // qualify

// or declare specific types
using std::string;

} // my_project

如果名称空间来自您自己的项目或相对较小的 库,那么我认为没有理由不将整个名称空间注入您自己的项目(永远不要注入全局名称空间)。

namespace my_project {

using namespace xmltools; // never do this in global namespace

// use without prefix here

} // my_project

关键是使用您的自己的 命名空间。那么你在里面所做的事情对使用你的 headers.

的人的影响就会较小

我认为重点是要记住,如果有人将 你的 命名空间中的符号注入到他们自己的命名空间中,他们不应该 感到惊讶 根据它包含的内容。

因此,如果我的库建立在另一个库上,我的库可能 正常 包含来自另一个库的类型符号,而将我的命名空间注入他们的命名空间的人也会期望.

在 header 文件的全局范围内使用 using namespace using 指令不是好的做法。您可以做一些不太激烈的事情,但这些事情是相当温和的。

  • 在 header 的内联函数或模板函数中,您可以使用 using 指令而不影响其他任何人。这使您不必在 non-trivial 函数 body.
  • 中限定所有名称
  • 正如 Maksim Solovjov 所建议的,您可以使用命名空间别名来减少输入,但需要注意的是,全局范围内的命名空间别名会将该别名引入包括您的 header 在内的任何人,因此这可能是不可取的.
  • C++11 引入了 type aliases and alias templates,它可以在 header 的 class 作用域、函数作用域或命名空间作用域中使用(您可能仍然希望避免在全局范围内使用它们scope) 来给类型一个更短的名字。这在处理具有长名称的模板类型时特别有用,例如std::map<std::string, std::vector<std::function<float(float)>>>
  • C++11 和 14 通过 auto 关键字进行类型推导可以大大减少在 header 中命名 long 类型的需要,无论是函数 return 类型、局部变量还是lambda 的参数。
  • C++11 decltype 也可用于避免在某些情况下说出 long 类型的名称。