- 前回:std::vector / std::set 両方からデータを取れる関数をあまりテンプレートにしたくない - 標準愚痴出力
- 次回:(続々) std::vector / std::set 両方からデータを取れる関数をあまりテンプレートにしたくない - 標準愚痴出力
- 次々回:hymkor/study-cpp-enumerate: std::vector / std::set 両方からデータを取れる関数の本体をあまりテンプレートにしたくない (GitHub 2023.04.28記)
関数オブジェクトで、少し改善できました。
#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>(…)
は長いすぎる。クラス名くらいは一つにしたい…