C++ 中的“using”关键字

2023-11-26

我正在学习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关键词?


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

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

可读性和描述性

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

一个例子是:

using fileName = std::string;

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

我觉得我必须再次重申:这只是一个别名。任意函数取fileName作为一个论点可以很好地适用于任何std::string争论。

不必要typenames

有些可能看起来没有必要,例如:

using setOfPaths = std::set<filePath>;

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

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

with:

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>;

关于类型安全的注意事项

这实际上并不比根本不使用别名更安全。再次,fileName and std::string是完全相同的类型。您可以互换使用两者。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的“using”关键字 的相关文章

随机推荐