我正在查看STL实现的几个来源(SGI,STLport,libc ++),并看到了一些似乎对所有或大多数实现都很常见的设计模式,但我找不到理由。我认为必须有一个良好的共鸣,并想知道它是什么:
许多类,包括vector
和list_iterator
等,都被实现为2个类,例如list_iterator_base
包含部分功能,然后list_iterator
继承list_iterator_base
与接口的其余部分。有什么意义?似乎可以在一个班级中轻松完成。
迭代器似乎没有使用iterator
类。使用它会有一些性能损失吗?
这是我在快速浏览中发现的两个问题。如果有人知道一个很好的资源来解释STL实现的实现原理,我会很高兴听到它。
答案 0 :(得分:7)
答案非常简单:
std::iterator<...>
并不真正起作用:根据模板参数在基类中定义的类型不能在从这样的基础派生的类模板中直接访问。也就是说,类型需要使用基类进行限定,并且需要使用typename
标记为类型。更糟糕的是,用户理论上可以分配派生类的对象,并通过指向std::iterator<...>
的指针释放它们(是的,这将是一件愚蠢的事情)。也就是说,没有任何好处,但潜在的缺点,即最好避免。那就是说,我不知道任何有关实现通用库技术的好资源。在STL实现中应用的大多数细节是由多人独立发明的,但是关于通用编程的文献仍然相对稀少。我认为任何描述STL的论文都不会讨论实现技术:它们通常专注于设计细节。鉴于只有极少数人似乎了解STL的含义,作者倾向于专注于描述STL是什么而不是如何实现它并不是一个大惊喜。