dropwhile

takewhileと似ていますが、実のところあまり使いません。
叙述関数がtrueの間は値を出しません。

template<typename T, typename U>
class cDropWhile : public cIterable<T> {
    U       pred;
    std::shared_ptr<cIterable<T>>   gen;
    bool    first;
    
public:
    cDropWhile(U p, std::shared_ptr<cIterable<T>> g) :
                                pred(p), gen(g), first(true) { }
    
    bool exists_next() {
        if(first) {
            first = false;
            while(gen->exists_next()) {
                if(!pred(gen->value()))
                    return true;
            }
            return false;
        }
        else {
            return gen->exists_next();
        }
    }
    T value() const { return gen->value(); }
};

template<typename T, typename U>
std::shared_ptr<cIterable<T>> dropwhile(
                U pred, std::shared_ptr<cIterable<T>> gen) {
    return std::shared_ptr<cIterable<T>>(new cDropWhile<T,U>(pred, gen));
}

下のコードは、4より小さい間は値は出さずにそのあとは出します。

int main() {
    auto    f = [] (int n) { return n * (4 - n); };
    auto    g = map(f, range(5));                           // 0 3 4 3 0
    cout << dropwhile([] (int n) { return n < 4; }, g) << endl; // 4 3 0
}