|
|
1
27
[不幸的是,最好的答案被版主删除了,因为这是一个只有链接的答案。我理解为什么不鼓励只链接的答案;然而,删除它剥夺了未来搜索者非常有用的信息。该链接已保持稳定七年多,并在撰写本文时继续有效。] "The Standard Librarian: Defining Iterators and Const Iterators" ,2001年1月。如果这个链接坏了,现在Dobb博士的已经停止运行,它也可以使用 here .
其思想是将迭代器作为一个模板实现一次,该模板接受一个额外的模板参数,一个布尔值,表示这是否是const版本。在实现中常量和非常量版本不同的任何地方,都可以使用模板机制来选择正确的代码。马特·奥斯特的机制被称为
如果对常量迭代器和非常量迭代器有单独的实现,那么常量实现将包括以下类型的typedef:
而非const实施将有:
但是
通过对底层类型使用typedef,所有迭代器方法都可以具有相同的实现。看马特·奥斯特的 complete example . |
|
|
2
11
constness.h:
这可以与以下内容一起使用:
|
|
|
3
2
除了建议将常量和非常量模板化之外,还可以通过查看 Boost.Iterator tutorial -这也提到了同样的解决方案。 |
|
|
4
2
|
|
|
5
2
阿瑟·奥德怀尔在他的博客文章中详细回答了这一问题: https://quuxplusone.github.io/blog/2018/12/01/const-iterator-antipatterns/
另外,添加
|
|
|
6
1
您可以使用CRTP和一个公共基来“注入”方法(但您仍然必须在当前的C++中复制CTOR),或者只使用预处理器(无需抖动;可以轻松地处理以下问题:
使用std::iterator、它提供的typedef以及您可能提供的任何其他typedef来直接生成宏。 |