リストに対して写像を施して別のリストを作ります。
template<typename T, typename U, typename V> class cMap : public cIterable<T> { U func; shared_ptr<cIterable<V>> gen; public: cMap(U f, shared_ptr<cIterable<V>> g) : func(f), gen(g) { } bool exists_next() { return gen->exists_next(); } T value() const { return func(gen->value()); } }; template<typename U, typename V> auto map(U func, shared_ptr<cIterable<V>> gen) -> shared_ptr<cIterable<decltype(func(gen->value()))>> { typedef decltype(func(gen->value())) T; return shared_ptr<cIterable<T>>(new cMap<T,U,V>(func, gen)); }
次は1から10の平方の和を求めるコードです。
int main() { auto f = [] (int n) { return n * n; }; cout << sum(map(f, range(1, 11))) << endl; }