【问题标题】:Is there good practices for where to declare using in C++? [closed]在 C++ 中声明使用的位置是否有良好的做法? [关闭]
【发布时间】:2019-03-24 09:07:43
【问题描述】:

有没有好的做法来声明一个 using(对于 typedef 之类的用法)?

例如,如果我有一个有 std::array<std::array<T, W>, H> 成员的类,并且我想使用这样的 using 来简化阅读和写作

template<typename T, uint32_t H, uint32_t W>
using matrix = std::array<std::array<T, W>, H>;

我应该把这个放在哪里?在类声明内部或外部,甚至在单独的头文件中?

谢谢

【问题讨论】:

  • 我认为最好在最接近的使用范围内这样做,例如在单个翻译单元中,甚至可能在单个函数定义中。
  • 头文件通常不应在其全局范围内包含using。尤其不是using namespace std;kind
  • 非常感谢您的 cmets。 πάντα-ῥεῖ确实很相似,我会检查这个
  • 这取决于太多的东西。你只在一个地方使用它吗?一节课?一个功能?整个项目?您的项目是一个库,您想公开类型供其他人使用?等等……

标签: c++ c++11 types typedef using


【解决方案1】:

您的type alias template 与模板类的用途完全相同,即定义一个类型:

template<typename T, uint32_t H, uint32_t W>
using matrix = std::array<std::array<T, W>, H>;

int main() {
    matrix<double, 10,3> m; 
    return 0;
}

所以最好的做法是像处理其他类型定义一样处理它:

  • 如果您打算在许多地方重用此定义,请将其放在标题中(您的示例似乎如此,因为矩阵是相当通用的东西);
  • 如果它是一个没有通用目的的实现细节,则将它嵌入到一个类中(可能在一个标题中);
  • 如果您在单个源文件中使用矩阵,请将其放在您使用它的编译单元中。

对于非模板类型的别名,原理和老typedef一样,所以和上面一模一样,另外,

  • 如果它的唯一目的是用作非常长的类型名称的非常​​本地的快捷方式,请将其放入函数体中。

【讨论】:

  • 伊什。实际上,它定义了一个新类型(至少比任何其他模板实例化都多)所以你应该小心奇怪的边缘情况,因此可能考虑使类型的名称范围更紧密否则你会费心去做。尽管在我的脑海中,我想不出任何值得考虑太多的严重问题。想一想,因为它不是一种新类型,也许没有任何边缘情况。嗯。
  • @LightnessRacesinOrbit 你当然是完全正确的。它没有定义 C++ 标准术语意义上的新类型,它只是声明 现有类型的别名。我正在考虑使用“提供”一词来避免任何混淆,但这会引发其他问题和歧义。最后,我更愿意将“定义”一词保留在其不太精确的常识中,因为问题是将它们放在哪里而不是它们是什么如何使用它们。
  • 是的,这很好 - 我的目的只是添加关于可能的警告的讨论,但当我完成时,我想我决定没有任何 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2023-03-25
  • 2010-09-08
  • 2016-09-03
  • 2010-12-25
相关资源
最近更新 更多