読者です 読者をやめる 読者になる 読者になる

RangeExでoven::any_range相当のことをしたい場合

C++

any_iteratoriterator_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