Boost.Range には std::for_each をラップした boost::for_each が 定義されているんですが、それとは別に にも boost::for_each が定義されていたので違いを調べてみました。
どうやら range を2つ受け取れるみたいです。

[ソース]

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

int
main(){
    std::vector<std::string> names{
        "mami",
        "mado",
        "homu",
        "saya",
        "an",
    };
    
    // <boost/range/algorithm/for_each.hpp>
    boost::for_each(names, [](std::string const& name){
        std::cout << name << std::endl;
    });

    // <boost/range/algorithm_ext/for_each.hpp>
    // range を2つ渡して評価するので、インデックスを付属させたり出来る
    boost::for_each(
        boost::irange(0u, names.size()), names,
        [](int index, std::string const& name){
            std::cout << index << ":" << name << std::endl;
        }
    );

    return 0;
}

[出力]

mami
mado
homu
saya
an
0:mami
1:mado
2:homu
3:saya
4:an


上記のコードみたいにインデックスを付属させたり出来るので思ったよりも使い勝手はよさそうですね。

[boost]

  • ver 1.52.0