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