takewhile

takewhileは、叙述関数がtrueである限り値があれば出し続けます。

template<typename T, typename U>
class cTakeWhile : public cIterable<T> {
    U       pred;
    shared_ptr<cIterable<T>>    gen;
    
public:
    cTakeWhile(U p, shared_ptr<cIterable<T>> g) : pred(p), gen(g) { }
    
    bool exists_next() {
        return gen->exists_next() && pred(gen->value());
    }
    T value() const { return gen->value(); }
};

template<typename T, typename U>
shared_ptr<cIterable<T>> takewhile(U pred, shared_ptr<cIterable<T>> gen) {
    return shared_ptr<cIterable<T>>(new cTakeWhile<T,U>(pred, gen));
}

以下は、50以下の平方数の和を求めています。

int main() {
    auto    pred = [] (int n) { return n <= 50; };
    cout << sum(takewhile(pred,
            map([] (int n) { return n * n; }, range(1, 10)))) << endl;
}