フィボナッチ数列

フィボナッチ数列を適当に作ります。

class cFib : public cIterable<int> {
    int     a;
    int     b;
    
public:
    cFib() : a(1), b(1) { }
    
    bool exists_next() {
        int     tmp = b;
        b += a;
        a = tmp;
        return true;
    }
    int value() const {
        return a;
    }
};

shared_ptr<cIterable<int>> fib() {
    return shared_ptr<cIterable<int>>(new cFib());
}

これで、Project EulerのProblem 2が計算できます。

    const int   N = 4000000;
    auto    even = [] (int n) { return n % 2 == 0; };
    auto    pred = [&] (int n) { return n <= N; };
    cout << sum(takewhile(pred, filter(even, fib()))) << endl;