我正在学习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
关键字有什么好处?
答案 0 :(得分:13)
using
关键字用于定义类型别名。你的教授使用它的原因是:
typename
您可以在语义上(并且仅限制)使用类型别名来限制特定类型,使名称更具描述性以供特定用途使用。
一个例子是:
using fileName = std::string;
fileName
别名用于描述文件名字符串,而不仅仅是任何字符串。这也使得可读功能签名。
我觉得我必须再次迭代它:它只是一个别名。任何以fileName
为参数的函数都可以适用于任何std::string
参数。
typename
s 有些似乎没必要,例如:
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>;
实际上,除了根本不使用别名之外,这实际上不再是类型安全的。同样,fileName
和std::string
的类型完全相同。您可以互换使用。
可能的下一步是定义具有自己的特定不变量的特定fileName
类/结构类型。