C++ で Python の for を書きたい

Python の for 文って、 C++ のに比べて格好イイですよね。

# Python
for i in range( 0, n ):
  # 0, 1, ... , n に対して処理する
// C/C++
for( int i = 0; i < n; ++i ) {
  // 0, 1, ... , n に対して処理する
}


単純に Python の方が短く書ける、というのも素晴らしいですが、
C++ ではループ中にループ変数 i を変更した場合に上手く動作しないのに対し、
Python ではループ変数 i がループの制御からは無関係なのが素晴らしい。


例えば

# Python
for i in range( 0, n ):
  i = i * 2; print( i )
// C++
for( int i = 0; i < n; ++i ) {
  i = i * 2; std::cout << i << std::endl;
}

とか書いた場合、 Python では 0 2 4 6 … と表示されるのに対し*1
C++ では 0 2 6 14 … と表示されます*2
どちらの動作が良いかといえば、そりゃ Python でしょう。
何とかして C++ でも Python みたいに書けないものでしょうか。




それ BOOST_FOREACH と boost::irange で出来るよ!

#include <boost/foreach.hpp>
#include <boost/range/irange.hpp>
#include <iostream>
int main()
{
  BOOST_FOREACH( int i, boost::irange( 0, 10 ) ) {
    i = i * 2; std::cout << x << std::endl;
  }
}

BOOST_FOREACH がキモいですが、 C++0x なら範囲 for 構文を使って

#include <boost/range/irange.hpp>
#include <iostream>
int main()
{
  for( int i : boost::irange( 0, 10 ) ) {
    i = i * 2; std::cout << x << std::endl;
  }
}

と書けます。素晴らしい。


なお、通常は、ループ中にループ変数を書き換えることはないので、

BOOST_FOREACH( int const i, boost::irange( 0, n ) ) {
  // 0 から n-1 まで処理
}

と const として定義するのが望ましいです。もし偶数をループしたい場合は、

BOOST_FOREACH( int const i, boost::irange( 0, n*2, 2 ) ) {
  // 0, 2, ... , 2*(n-1) に対して処理
}

と書くことで差分を指定出来ます。これは丁度、 Python

for i in range( 0, n*2, 2 ):
  # 0, 2, ... , 2*(n-1) に対して処理

と同じであり、 Python 同様、負の差分を使うことも出来ます。

BOOST_FOREACH( int const i, boost::irange( n, 0, -1 ) ) {
  // n, n-1, ... , 1 に対して処理
}


これなんで C++0x の標準ライブラリに無いの?