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

(前回: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>(…) は長いすぎる。クラス名くらいは一つにしたい…