如何重载Container类begin方法适配普通与const迭代器?
解决方案
要让begin()同时支持非const对象返回iterator、const对象返回const_iterator,只需要在Container类中重载两个版本的begin()方法:
修改后的Container类关键代码
template<typename T> class Container { // ... 其他原有代码保持不变 ... public: size_type size() const { return size_; } // 非const对象调用的版本:返回可修改的iterator iterator begin() { return iterator(arr_); } // const对象调用的版本:返回只读的const_iterator const_iterator begin() const { return const_iterator(arr_); } };
原理说明
- 调用非const对象
v.begin()时,编译器会匹配非const成员函数版本,返回Vector<double>::iterator,满足第一种场景的需求; - 调用const对象
v2.begin()时,编译器会匹配const成员函数版本,返回Vector<double>::const_iterator,满足第二种场景的需求。
补充说明
原代码中Iterator模板的定义已经能正确区分const和非const的指针/引用类型,所以只需要补充这两个重载方法即可,不需要修改迭代器的内部实现。
内容的提问来源于stack exchange,提问作者Timsan
相关产品推荐
相关产品推荐

