c++ - C++ 中的 "using"关键字

标签 c++ c++11 using

我正在学习 C++。我的教授使用了一些类似的代码

using filePath = std::string;
using setOfPaths = std::set<filePath>;
using iterOfSet = setOfPaths::iterator;
using listOfIter = std::list<iterOfSet>;
using iterList = listOfIter::iterator;
using fileName = std::string;
using mapOfFileName = std::map<fileName, listOfIter>;
using iterOfMap = mapOfFileName::iterator;

setOfPaths _setOfPaths;
mapOfFileName _mapOfFileName;
iterOfSet setIter;

我想知道为什么我们要使用 using 关键字。为什么我们不能简单地写

std::string filepath;

std::set<filepath> setOfPaths;
...
...

using 关键字有什么好处?

最佳答案

using 关键字用于定义类型别名。您的教授使用它的原因是:

  • 可读性
  • 更具描述性
  • 避免不必要的typename

可读性和描述性

您可以使用类型别名在语义上(并且仅此)限制特定类型,使名称对特定用途更具描述性。

一个例子是:

using fileName = std::string;

fileName 别名用于描述文件名字符串,而不仅仅是任何字符串。这也使得函数签名可读。

我觉得我必须再次重复这个:它只是一个别名。任何将 fileName 作为参数的函数都可以与任何 std::string 参数一起正常工作。

不必要的typename

有些看起来没必要,比如:

using setOfPaths = std::set<filePath>;

但在某些情况下,它们实际上可用于避免在以下情况下必须指定 typename:

template<typename Type>
struct something {
    using something_iter = typename std::set<Type>::iterator;
};

与:

template<typename Container>
using itertype = typename Container::iterator;

template<typename Type>
struct something {
    using something_iter = itertype<std::set<Type>>;
}; 

通过在特定别名中移动 typename,我们可以在多个其他场合重用 itertype,有效地避免 typename

关于typedef的注释

还有另一种定义类型别名的方法:typedef。该关键字继承自 C,不允许使用模板化别名,例如:

template<typename Type>
using vec = std::vector<Type>;

类型安全注意事项

这实际上并不比根本不使用别名更安全。同样,fileNamestd::string 是完全相同的类型。您可以交替使用两者。

下一步可能是定义一个特定的 fileName 类/结构类型,它有自己特定的不变量。

关于c++ - C++ 中的 "using"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575202/

相关文章:

c++ - 如何更改从 '///' 生成的代码注释模板的 visual studio 默认输出

c++ - 指针运算 : how are these statements different?

c# - 命名空间外的 using 语句被识别为不同的命名空间

c++ - 使用关键字公开 protected 重载方法

c++ - 顶点属性 - 使用 short 而不是 float 作为顶点位置

c++ - 将路径传递给 CreateProcessA

c++ - 以自然(非反向)顺序将函数应用于 std::tuple 中的元素

c++ - 循环中 unsigned long long int 的奇怪行为

c++ - 不允许复制构造函数但允许从其他类型隐式复制

c# - 使用指令导入子命名空间