(半日も経ってませんが、(続) 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()) ); }
よしよし