类 中的类型别名有什么作用?
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++ 促进的较少模板的代码中不太关心。
我很好奇并查看了 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++ 促进的较少模板的代码中不太关心。