読者です 読者をやめる 読者になる 読者になる

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 でループしたほうがよい気はする。