PStade.OvenライブラリをC++0x Range for文に対応しました。

いつもながらMBさんのパッチを適用しただけで、いつもながらまだリリースはしてないのでSVNから最新とってきてください。
gcc-4.6-20101002で以下のコードは通るようになってます。

#include <iostream>
#include <vector>
#include <pstade/oven/filtered.hpp>
 
bool is_even(int x) { return x % 2 == 0; }
 
int main()
{
    const std::vector<int> v = {1, 2, 3};
    for (int i : v | pstade::oven::filtered(&is_even)) {
        std::cout << i << std::endl;
    }
}
2

ちなみに、initializer_listのリテラルをRangeアダプタに直接適用することはできないので、initializer_listを受け取ってそのまま返す単純な関数を挟む必要があります。

#include <iostream>
#include <pstade/oven/filtered.hpp>
 
bool is_even(int x) { return x % 2 == 0; }
 
template <class T>
std::initializer_list<T> init_id(const std::initializer_list<T> init)
{
    return init;
}
 
int main()
{
    for (int i : init_id({1, 2, 3}) | pstade::oven::filtered(&is_even)) {
        std::cout << i << std::endl;
    }
}
2

これをOvenに入れるかどうか、どのような形で入れるかは現在考え中です。