oven::any_range

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;


【参照】
pstade::oven::any_range