在C ++中使用“using”关键字

时间:2015-02-18 02:58:49

标签: 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关键字有什么好处?

1 个答案:

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

关于类型安全的说明

实际上,除了根本不使用别名之外,这实际上不再是类型安全的。同样,fileNamestd::string的类型完全相同。您可以互换使用。

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