filter

Pythonのifilterを作ります。叙述関数を適用してtrueになる要素だけ出します。
以下は、3の倍数だけ出力するコードです。

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

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

int main() {
    auto    g = filter([] (int n) { return n % 3 == 0; }, range(10));
    cout << g << endl;
}