pstade::oven::outdirected の実装と Boost.Range でエミュレート

pstade::oven::outdirected の実装がどうなっているのかなーとソースコードを見てみたら pstade::oven::counting でラップしているだけでした。
こんな感じ。

std::vector<int> v = {1, 2, 3, 4, 5};

auto outdirect = pstade::oven::counting(std::begin(v), std::end(v));

boost::for_each(outdirect, [](std::vector<int>::iterator it){
    std::cout << *it << std::endl;
});


ほむほむ、なるほどなー。
で、同等の機能を Boost.Range で実装する場合は boost::irange を使えばよさそう。

[ソース]

#include <boost/range/irange.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <iostream>

template<typename Range>
auto
outdirect(Range& range)
->decltype(boost::irange(std::begin(range), std::end(range))){
    return boost::irange(std::begin(range), std::end(range));
}


int
main(){
    std::vector<int> v = {1, 2, 3, 4, 5};

    boost::for_each(outdirect(v), [](std::vector<int>::iterator it){
        std::cout << *it << std::endl;
    });

    return 0;
}

[出力]

1
2
3
4
5

[boost]

  • ver 1.52.0