oven::any_rangeは、あらゆるiterator rangeを保持することのできる範囲型です。
Rangeアダプタの適用結果を変数に保持しておきたいときに使います。
#include <iostream> #include <vector> #include <pstade/oven/any_range.hpp> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/filtered.hpp> #include <pstade/oven/reversed.hpp> #include <pstade/oven/algorithm.hpp> using namespace pstade::oven; bool is_even(int x) { return x % 2 == 0; } void show(int x) { std::cout << x << std::endl; } int main() { const std::vector<int> v = initial_values(1, 2, 3, 4, 5); any_range<int, boost::forward_traversal_tag> r = v|filtered(&is_even)|reversed; for_each(r, &show); }
4 2
上記のケースにおいて、式v|filtered(&is_even)|reversedの型をまじめに書こうとすると
iterator_range< reverse_iterator< filter_iterator<bool(*)(int), vector<int>::const_iterator> >, null_injector> r = v|filtered(&is_even)|reversed
くらい長くなってしまうのが、any_rangeを使うとこれだけで済みます。
any_range<int, boost::forward_traversal_tag> r = v|filtered(&is_even)|reversed;