C++ の range-based for 内で iterator を進めたい
通常 range-based for を使用する場合は iterator ではなくて実体を参照するのでユーザから iterator の操作を行うことは出来ません。 ので、range-based for 内でも間接的に iterator を操作できるようなラッパーを書いてみました。
[コード]
#include <vector> #include <string> #include <iostream> template<typename T> struct iteratorable{ using iterator_type = typename T::iterator; struct iterator_wrapper{ iterator_wrapper(iterator_type itr) : itr(itr) {} iterator_type& operator * (){ return itr; } iterator_type& operator ++ (){ return ++itr; } bool operator != (const iterator_wrapper& o){ return itr < o.itr; } iterator_type itr; }; iterator_wrapper begin(){ return { list.begin() }; } iterator_wrapper end(){ return { list.end() }; } T& list; }; template<typename T> iteratorable<T> as_iterator(T& t){ return { t }; } int main(){ std::vector<std::string> table = { "homu", "mami", "mado", "saya", "an" }; for(auto&& it : as_iterator(table)){ std::cout << "name :" << *it << std::endl; it++; } return 0; }
[出力]
name :homu name :mado name :an
まあそもそも range-based for は『iterator を操作しないで安全なループを行う』って役割もあると思うのでこういうアプローチをしたいなら直接 for 文 + iterator でループしたほうがよい気はする。