在标头中处理痛苦的长命名空间名称

Voi*_*tar 6 c++ namespaces header-files c++14

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

我能想到的唯一可以清理的唯一工作特征是#define+ #undef但这看起来很糟糕.

是否有一个新功能可以解决这个我不知道的问题?我也对任何受欢迎的提案感兴趣.也许using用括号内的块语法,让我将效果限制在我的标题......?

mat*_*ort 5

using namespace在头文件中在全局范围内使用using指令并不是一种好习惯.然而,你可以做的一些不太激烈的事情是相当温和的.

  • 在标题中的内联或模板函数内,您可以使用using指令而不会影响其他任何人.这样可以节省您在非平凡函数体中限定所有名称的麻烦.
  • 正如Maksim Solovjov建议的那样,您可以使用命名空间别名来减少键入,但需要注意的是,全局范围内的命名空间别名会将该别名引入任何人,包括您的标题,这可能是不可取的.
  • C++ 11引入了类型别名和别名模板,可以在类范围,函数范围或命名空间范围的标头中使用(您可能仍希望避免在全局范围内使用它们)为类型提供更短的名称.这在处理具有长名称的模板类型时特别有用,例如std::map<std::string, std::vector<std::function<float(float)>>>
  • 通过auto关键字进行C++ 11和14类型的推导可以大大减少在头文件中命名长类型的需要,无论函数返回类型,局部变量还是lambda参数.
  • decltype在某些情况下,C++ 11 也可以避免说长类型的名称.