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