http://d.hatena.ne.jp/uskz/20090830/p2
たぶん、こうすれば解決するんじゃないかと思う。
まず、std::begin/endは名前がよろしくないのでrange_begin/range_endにして
namespace std { template <class C> auto range_begin(C& c) -> decltype(c.begin()); template <class C> auto range_begin(const C& c) -> decltype(c.begin()); template <class C> auto range_end(C& c) -> decltype(c.end()); template <class C> auto range_end(const C& c) -> decltype(c.end()); // めんどくさいので配列, pair, tuple, valarrayは省略... }
Range版のfor_eachを用意して(ADL使用)
template <class R, class F> F for_each(R& r, F f) { return std::for_each(range_begin(r), range_end(r), f); } template <class R, class F> F for_each(const R& r, F f) { return std::for_each(range_begin(r), range_end(r), f); }
以下のRange-base for文の構文が
for (for-range-declaration : expression) statement
以下のように置き換えられればいいんじゃないかと。
for_each(expression, [&](for-range-declaration) { statement });