C++でforeachみたいなことができるBoost.Foreach

ヘッダー

boost/foreach.hpp

できること

C++で他の言語にあるようなforeachっぽいことができるようになる.

使用例

BOOST_FOREACHを使ってコンテナの各要素にアクセスする場合の例.

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);

BOOST_FOREACH(int i, v) {
  std::cout << i << std::endl;
}

コンテナだけでなく配列にも使える.

int a[] = {1, 2, 3};

BOOST_FOREACH(int i, a) {
  std::cout << i << std::endl;
}

リファレンスを使って各要素にアクセスすることも可能.

int a[] = {1, 2, 3};

BOOST_FOREACH(int& i, a) {
  ++i;
} // a = {2, 3, 4} となる

さらに,以下のようにdefineしておくと…,

#define foreach BOOST_FOREACH

よりforeachっぽくなっていい感じに.

foreach(int i, v) {
  std::cout << i << std::endl;
}

これは便利.

注意点

BOOST_FOREACHはマクロで定義されているため,ループで回す変数の型にカンマが入っているとマクロの引数の区切りと解釈されてエラーになってしまう.

std::map<int, int> m;

// エラーになる
BOOST_FOREACH(std::pair<int, int> p, m) { ... }

回避策は二通り.ループ用の変数の型をtypedefしておくか…,

std::map<int, int> m;
typedef std::pair<int, int> pair_t;

// OK
BOOST_FOREACH(pair_t p, m) { ... }

ループ用の変数をBOOST_FOREACHの外であらかじめ定義しておく.

std::map<int, int> m;
std::pair<int, int> p;

// OK
BOOST_FOREACH(p, m) { ... }