any_iteratorのiterator_rangeを作る。
#include <iostream> #include <vector> #include <boost/range/adaptor/filtered.hpp> #include <boost/range/adaptor/transformed.hpp> #include <boost/range/algorithm/for_each.hpp> #include <boost/lexical_cast.hpp> #include "any_iterator.hpp" bool is_even(int x) { return x % 2 == 0; } std::string to_string(int x) { return boost::lexical_cast<std::string>(x); } struct disp { typedef void result_type; template <class T> void operator()(const T& x) const { std::cout << x << std::endl; } }; int main() { using namespace boost::adaptors; using IteratorTypeErasure::any_iterator; const std::vector<int> v = {1, 2, 3, 4, 5}; { typedef any_iterator<const int, boost::forward_traversal_tag> iter; boost::iterator_range<iter> r = v | filtered(&is_even); boost::for_each(r, disp()); } { typedef any_iterator<std::string, boost::forward_traversal_tag, std::string> iter; boost::iterator_range<iter> r = v | filtered(&is_even) | transformed(&to_string); boost::for_each(r, disp()); } }
any_iteratorはBoost入りしてるライブラリではないので、以下を参照:
any_iterator: Type Erasure for C++ Iterators