在阅读SGI STL的列表迭代器实现时遇到问题。
template<class T>
struct __list_node {
void *prev;
void *next;
T data;
};
template<class T, class Ref, class Ptr>
struct __list_iterator {
typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, Ref, Ptr> self;
...
typedef T value_type;
typedef Ptr pointer;
typedef Ref reference;
typedef __list_node<T>* link_type;
...
link_type node;
...
reference operator*() const { return (*node).data; }
pointer operator-> const { return &(operator*()); }
self& operator++() { ... }
self operator++(int) { ... }
...
...
};
那么,为什么会有三个模板参数?
如果仅class T
存在怎么办?像下面这样。
template<class T>
struct __list_iterator {
typedef __list_iterator<T> iterator;
typedef __list_iterator<T> self;
...
typedef T value_type;
typedef T* pointer;
typedef T& reference;
...
...
};
我想知道对于某些特定的class T
是否必须使用三个参数,或者由于某些原因我无法弄清楚。
希望有人能帮助我。非常感谢!
答案 0 :(得分:1)
Alexander Stepanov(STL的发明者)解释了为什么在课程Lecture 11的课程here中,在STL中引入了reference
和pointer
成员别名使用组件进行高效编程< / em>。
简而言之,Stepanov最初认为–给定迭代器it
,可以安全地假设*it
的类型为value_type&
,&*it
的类型为{ {1}}。但是,微软表示将投票反对将STL包含在标准中,除非它可以容纳多个内存模型,当时该模型包括具有微小,巨大和长指针的模型。因此,引入了value_type*
和reference
。引用他的演讲:
“这不是特别有害,但是会混淆事物。语言专家当然喜欢它;它为他们提供了稳定的就业机会。”
有趣的是,即使Stepanov为满足其要求而更改了STL的整个体系结构,Microsoft仍然决定投票反对该STL。
课程的相关部分是{{3}}。