pstade::oven::any_range

#include <iostream>

#include <pstade/oven/any_range.hpp>

#include <pstade/oven/filtered.hpp>
#include <pstade/oven/transformed.hpp>
#include <pstade/oven/io.hpp>

#include <boost/lambda/lambda.hpp>


template<typename T>
pstade::oven::any_range<
    typename pstade::oven::range_value<T>::type,
    boost::forward_traversal_tag
>
even_range(T& array){
    return array|pstade::oven::filtered(boost::lambda::_1 % 2 == 0);
}

int
main(){
    namespace oven = pstade::oven;
    namespace lambda = boost::lambda;

    int array[] = {0, 1, 2, 3, 4};

    // 保持する値の型と iterator のタイプを指定する
    oven::any_range<int, boost::forward_traversal_tag>
        range = array|oven::transformed(lambda::_1 + lambda::_1);
    std::cout << range << std::endl;
    
    // 保持している値が同じなら何でも格納できるんじゃなイカ
    std::vector<int>    v = array|oven::copied;
    range = v|oven::filtered(lambda::_1 >= 4);
    std::cout << range << std::endl;

    // 関数の戻り値とかに便利でゲソ
    std::cout << even_range(array) << std::endl;

    return 0;
}


[出力]

{0,2,4,6,8}
{4}
{0,2,4}


pstade::oven::any_range は、保持する値の型と iterator のタイプが同じであれば、あらゆる range を格納することが出来る事が出来ます。
配列を range として保持する場合や、関数の戻り値として使う場合に便利です。


[pstade]
ver 1.04.3
[参照]
http://d.hatena.ne.jp/faith_and_brave/20100104/
http://www.cppll.jp/cppreference/iterators.html