类 中的类型别名有什么作用?

what does type alias do in classes?

我很好奇并查看了 std::vector 的实现细节。我不明白很多代码,但我对“使用”声明感到困惑。我看到很多 classes 还包括那些 using 语句或 typedef 在他们的 classes 中。在 class 中使用 using 声明有什么意义?它是否引入了新的成员变量或其他东西?我对它的工作原理感到困惑。

using iterator               = _Vector_iterator<_Scary_val>;
using const_iterator         = _Vector_const_iterator<_Scary_val>;
using reverse_iterator       = _STD reverse_iterator<iterator>;
using const_reverse_iterator = _STD reverse_iterator<const_iterator>;

using 在 C++11 中引入,作为 typedef 的更高级和更灵活的替代品,特别是在模板元编程中。

无论使用 typedef 还是 using,标准容器都定义了一组通用的内部类型别名,因此可以以更通用的方式编写代码,尤其是在模板元编程中。例如,您可以编写一个接受任何标准容器作为输入的函数,然后使用其内部别名而不必知道容器本身的类型。这使您可以轻松地在容器之间切换,而无需重新编写使用容器的代码。例如 1:

template<typename Container>
void doSomething(const Container &c) {
    for(typename Container::const_iterator iter = c.cbegin(); iter != c.cend(); ++iter) {
        // use *iter as needed ...
    }
}

1:显然,现在有更好的写法,比如for(const auto &elem : c) { ... }

所以,也许有一天你开始使用 std::vector,例如:

std::vector<int> v;
...
doSomething(v);

然后您决定改用 std::list,例如:

std::list<int> l;
...
doSomething(l);

您可以更改使用的容器类型,而无需更改函数本身。

这些声明声明了 class 的类型成员。正如 class 可以有数据成员一样,它也可以有类型成员(它们不占用 space 因为它们是编译时构造)。某些类型成员由 C++ 标准规定。有些只是为了方便,这样您就可以使用缩写的类型名称,而不是甚至可能无法放在一行中的类型名称。提供了其他一些与 C++ 库进行互操作,即。图书馆可能会对传递给它的用户类型提出要求,要求某些成员类型出现在这些类型中。有时,类型别名用于以这样的形式公开内部实现细节 public。 IE。 class 可能有一些私有模板成员类型,可以使用这样的别名公开其特定实例化,而不公开通用(模板化)类型。

最后,使用类型别名有助于在大量使用模板的代码中提高编译器性能:如果您可以在创建新类型(例如派生自另一种类型或包含一个类型)或使用方便的别名之间做出选择,那么别名将在编译期间显着降低内存和性能影响。这仅适用于模板元编程,在现代 C++ 促进的较少模板的代码中不太关心。