map

リストに対して写像を施して別のリストを作ります。

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;
}