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

寿命の心配がないRange-base for文

C++

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 });