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

C++Builderでのboost::foreachの使い方

boost1.34.0の新機能でいいなって思ったのが、boost::foreach
VBとかRubyPerlJavaなど最近の言語でお馴染みの配列等の繰り返し構文って奴ね。

VB6だとこんな感じかな?

For Each hoge In fuga
  あれこれ
Next

C++だと、std::for_eachを使うべきなのだろうけど、こいつは関数オブジェクトを書いてやらなければならないからちと面倒。

std::for_each(fuga.begin(), fuga.end(), Chogehoge());

後は素直にfor文で回すことくらいかな?

for (iter = fuga.begin(); iter != fuga.end(); ++iter) {
  あれこれ
} 

でも、繰り返し処理毎に関数オブジェクトを定義するのは嫌だし、かといって、イテレータ込みのfor文を書くのも面倒。
まぁ、C++Builderだと、コードテンプレートを使うって手もあるけど、手間的にはあまり変わらない。

そんな、おいらみたいなものぐさなプログラマにうってつけなのが、C++でforeach構文を実現するboost::foreach。
どんなに便利かは、以下のコードで一目瞭然。

#include 
#include 
#include 
#pragma hdrstop
#include 

class CFoo
{
public:
  CFoo(const AnsiString& str) :
    m_str(str)
  {
  }

public:
  AnsiString  m_str;

public:
  void printString(void) const
  {
    std::cout << m_str << std::endl;
  }
};

#pragma argsused
int main(int argc, char* argv[])
{
  std::vector FooTable;

  FooTable.push_back(CFoo("aaaaa"));
  FooTable.push_back(CFoo("bbbbb"));
  FooTable.push_back(CFoo("ccccc"));
  FooTable.push_back(CFoo("ddddd"));
  FooTable.push_back(CFoo("eeeee"));

  BOOST_FOREACH( CFoo i, FooTable ) {
    i.printString();
  }

  return 0;
}

詳細はググると色々出て来るので割愛するけど、残念ながら、C++Builder2007と素のboost1.34.0の組み合わせでは駄目。ただし、bcbboostならば、問題無し。
あと、boost/foreach.hppをインクルードするのは、#pragma hdrstopの後。でないとコンパイルエラーになるので注意。
つまり、プリコンパイルヘッダでは使えません。

まぁ、プリコンパイルヘッダは仕方ないよね・・・。 テンプレートバリバリだし。

追記:
C++Builder2007 Update#1&boost1.34.1チンチン☆⌒ 凵\(\・∀・) まだぁ?
まぁ、Highlanderと平行作業だから、仕方ないか。