foreach

Problem
std::tr1::mem_fnやstd::tr1::bindを使わず、イテレータを使って自分でループ処理を書いてはいけませんか?

Solution
Algorithm vs Loopでも述べたように、ループ処理は極力避けることが望ましいです。
あなたは、「C++にも他のプログラミング言語のようなforeachステートメントがあれば良いのに」と思うかもしれません。
たしかにC++にはforeachステートメントはありませんが、boostにforeachステートメントを実装したライブラリBoost.Foreachがあります。
Boost.Foreachを使うと次のように書くことができます。
#include <list>
#include <boost/foreach.hpp>

class Widget {
public:
  void test(int n) {}
};

int main()
{
  std::list<Widget*> lspw;
  BOOST_FOREACH(Widget* pw, lspw) {
    pw->test(0);
  }
  return 0;
}
BOOST_FOREACHはマクロなので一見、ステートメントには見えません。
必要であればマクロを置き換えることで、ステートメントらしく見えるようになります。
#include <list>
#include <boost/foreach.hpp>

#define foreach BOOST_FOREACH

class Widget {
public:
  void test(int n) {}
};

int main()
{
  std::list<Widget*> lspw;
  foreach(Widget* pw, lspw) {
    pw->test(0);
  }
  return 0;
}
また、BOOST_FOREACHは標準コンテナだけでなく、配列やstd::pairに対しても使用可能です。
std::pairにはループさせる範囲(Range)を[first, second)で指定します。
#include <list>
#include <utility>
#include <boost/foreach.hpp>

class Widget {
public:
  void test(int n) {}
};

int main()
{
  std::list<Widget*> lspw;
  BOOST_FOREACH(Widget* pw, std::make_pair(lspw.begin(), lspw.end())) {
    pw->test(0);
  }
  return 0;
}
Notes
1. Boost.Foreach

人気blogランキングへ にほんブログ村 IT技術ブログへ FC2ブログランキングへ

« 前頁へ移動する  | HOME |  次頁へ移動する »

ブログ内検索


このサイト内ウェブ全体
この検索は「緑のgoo」を利用しています

カテゴリー

未分類 (0)
C++ (24)
Books (11)
Bookmarks (1)

最近のエントリ

移植性の高いコードを書くためには (02/16)
ハッシュコンテナ - Part3 (01/10)
ハッシュコンテナ - Part2 (10/29)
日本語によるC++0xに関する記事 (10/23)
foreach (08/03)

Books

C++
プログラミング
デザインパターン
オブジェクト指向

RSSフィード

最新記事のRSS
最新コメントのRSS
最新トラックバックのRSS

アーカイブ

2008年02月 (1)
2008年01月 (1)
2007年10月 (2)
2007年08月 (1)
2007年07月 (2)
2007年06月 (1)
2007年05月 (2)
2007年04月 (1)
2007年03月 (2)
2007年02月 (2)
2007年01月 (3)
2006年12月 (4)
2006年11月 (8)
2006年10月 (6)

連絡先

email.png

Amazon