range を for_each 等で走査する時に、次の値が欲しい

こんな感じ。

int    array[] = {0, 1, 2, 3, 4, 5};
boost::for_each(
    boost::combine(
        array|adaptors::sliced(0, boost::distance(array)-1),
        array|adaptors::sliced(1, boost::distance(array)  )
    ),
    [](boost::tuple<int, int> data){
    int n    = boost::tuples::get<0>(data);
    int next = boost::tuples::get<1>(data);    // 次の値
    std::cout << n << " -> " << next << std::endl;
});


画像処理を行うときでピクセルなんかを捜査する時に隣り合うピクセルが欲しい場合があるので(というか殆どそう)こういう処理が欲しくなります。
上記では、combine と sliced で、1つずらした range を合わせて捜査していますが、1つ前の値や3つ後の値などと増やして行くのは手間です。
そもそも最初の前や、最後の次はどうするの?って問題が・・・。
うーん、関数で受け取る時に range の iterator を取得して、そこから必要な場所の値を取得した方がいいのかなー。


[追記]
oven::offset を使えばちょっとすっきり。

int    array[] = {0, 1, 2, 3, 4, 5};
boost::for_each(
    boost::combine(
        array|oven::offset(0, -1),
        array|oven::offset(1,  0)
    ),
    [](boost::tuple<int, int> data){
    int n    = boost::tuples::get<0>(data);
    int next = boost::tuples::get<1>(data);    // 次の値
    std::cout << n << " -> " << next << std::endl;
});