いつもながら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に入れるかどうか、どのような形で入れるかは現在考え中です。