標準愚痴出力

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

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

関数オブジェクトで、少し改善できました。

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

template <class E,class T>
class enumerator {
    E m_cursor;
    E m_end;
public:
    enumerator(const E &begin,const E &end) : m_cursor(begin) , m_end(end) {}
    bool operator() (T &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>::iterator,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>::iterator,std::string>(s.begin(),s.end()) );
}

しかし、enumerator<std::set<std::string>::iterator,std::string>(…) は長いすぎる。クラス名くらいは一つにしたい…