C++ 实现容器时,写 iterator 很烦
实现一个 C++ 容器时,都要提供 iterator, const_iterator, 一般情况下 iterator 和 const_iterator 几乎完全一样,不一样的地方仅在于:
- iterator 可以修改容器的元素,const_iterator 不行
- iterator 可以 转化为 const_iterator,反之则不行
- iterator 由 容器的 non-const-member-function 返回/使用
- const_iterator 由 容器的 const-member-function 返回/使用
这样的代码写起来很烦,终于有一天,我实在忍受不了,想来想去,想了这么一个消除烦恼的办法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// file: MyContainer.hpp template<class Elem> class MyContainer { // some code ... public: struct iterator { typedef Elem value_type; #define ClassIterator iterator #include "MyContainer_iterator.hpp" }; struct const_iterator { typedef const Elem value_type; #define ClassIterator const_iterator #include "MyContainer_iterator.hpp" const_iterator(iterator y) {...} }; }; |
1 2 3 4 5 6 7 8 9 10 11 12 |
// file: MyContainer_iterator.hpp typedef value_type& reference; // annoying typedef's ... // ... // constructors... ClassIterator() { ... } // member functions // ... #undef ClassIterator |