BOOST_FOREACH

トップページ > 小道具 >

abstract

必要なヘッダ
<boost/foreach.hpp>
出来ること
拡張forループ
リファレンス
en

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <boost/foreach.hpp>
using namespace std;

int main()
{
    int array[] = {1,2,3,4,5};

    BOOST_FOREACH( int& e, array )
        if( e%2 == 0 )
            e = 0;

    BOOST_FOREACH( int e, array )
    {
        cout << e << endl;
    }
}

出力例

1
0
3
0
5

etc

百聞は一見にしかずといいますが、上のサンプルコードがすべてですね。

配列やコンテナの要素すべてを順に処理するループを簡単に書くためのマクロです。 正確には、Range として扱える物すべての上をループできます。 多重ループ、breakやcontinue、例外等によるループ脱出、中括弧の省略その他諸々、 完全にforやwhileループと同じように扱えます。

#define foreach BOOST_FOREACH

しちゃえば更にかっこいい感じになります。

ただし一つだけ落とし穴があって、マクロとして定義されているので、 型に , が含まれている場合上手く行きません。

vector< pair<int,int> > v;
BOOST_FOREACH(pair<int,int> e, v) { ... } // エラー!!!

型の途中の , がマクロの引数区切りと解釈されてしまうためです。 このような場合は、仕方がないので typedef で別名をつけて使います。

vector< pair<int,int> > v;
typedef pair<int,int> elem_t;
BOOST_FOREACH(elem_t e, v) { ... } // OK
presented by k.inaba (kiki .a.t. kmonos.net) under CC0