標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

(続々) std::vector / std::set 両方からデータを取れる関数をあまりテンプレートにしたくない

(半日も経ってませんが、(続) std::vector / std::set 両方からデータを取れる関数をあまりテンプレートにしたくない - 標準愚痴出力からの続きです)

前回 std::function を使って、コールバック関数を関数オブジェクトにし、呼び出しを簡素にしてみたわけですが、まだ型パラメータが長めでした。それをなんとか一つまでに減らしてみました。

#include <iostream>
#include <vector>
#include <functional>
#include <set>

template <typename T>
class enumerator {
    typename T::iterator m_cursor,m_end;
public:
    enumerator(typename T::iterator begin,typename T::iterator end)
        : m_cursor(begin) , m_end(end) {}
    bool operator() (typename T::value_type &store) {
        if( m_cursor == m_end ){
            return false;
        }
        store = *m_cursor;
        m_cursor++;
        return true;
    };
};


void put(const std::function<bool(std::string&)> &each)
{
    std::string value;
    while( each(value) ){
        std::cout << value << std::endl;
    }

int main()
{
    std::vector<std::string> v;
    v.push_back( "a" );
    v.push_back( "b" );
    v.push_back( "c" );

    put( enumerator<std::vector<std::string>>(v.begin(),v.end()) );

    std::set<std::string> s;
    s.insert( "a" );
    s.insert( "b" );
    s.insert( "c" );

    put( enumerator<std::set<std::string>>(s.begin(),s.end()) );
}

よしよし