Boost C++ Librariesプログラミング 第2版

Boost C++ Librariesプログラミング 第2版 Boost C++ Librariesプログラミング 第2版
稲葉 一浩 (2007/07)
秀和システム
この商品の詳細を見る

サポートページはこちら

'準'標準ライブラリともいえるboostの解説書です。
第2版では、Version 1.34に対応しており、Version 1.35の一部も先取りされています。boost使いは是非、手元に置いておきたい一冊です。

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

std::tr1::bind

Problem
std::tr1::bindとはいったい何なのでしょうか?

Solution
std::tr1::mem_fnのWidgetクラスのメンバ関数test()がint型の引数を一つ要求したとします。
class Widget {
public:
  ...
  void test(int n);  // 自己テストを実行する。
  ...
};

list<Widget*> lpw;
コンテナのすべてのWidgetをテストするために、再びstd::for_eachを使用します。
このような場合、std::mem_funやstd::tr1::mem_fnに加えstd::bind1stやstd::bind2ndが必要になります。
#include <list>
#include <algorithm>
#include <functional>
#include <tr1/functional>

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

int main()
{
  std::list<Widget*> lspw;
  std::for_each(lspw.begin(), lspw.end(), std::bind2nd(std::mem_fun(&Widget::test), 0));
  std::for_each(lspw.begin(), lspw.end(), std::bind2nd(std::tr1::mem_fn(&Widget::test), 0));
  
  return 0;
}
さて、ここでコンテナの要素をWidget*からstd::tr1::shared_ptrに変更した場合、どうなるでしょうか?
答えはコンパイルエラーです。
std::list<std::tr1::shared_ptr<Widget> > lspw;
std::for_each(lspw.begin(), lspw.end(), std::bind2nd(std::mem_fun(&Widget::test), 0)); // compile error.
std::for_each(lspw.begin(), lspw.end(), std::bind2nd(std::tr1::mem_fn(&Widget::test), 0)); // compile error.
それでは、ここでstd::tr1::bindの出番です。
#include <list>
#include <algorithm>
#include <functional>
#include <tr1/memory>
#include <tr1/functional>

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

int main()
{
  using namespace std::tr1::placeholders;
  
  std::list<std::tr1::shared_ptr<Widget> > lspw;
  std::for_each(lspw.begin(), lspw.end(), std::tr1::bind(&Widget::test, _1, 0));
  
  return 0;
}
素晴らしいことに、std::mem_funもstd::tr1::mem_fnも必要ありません。

最後に、メンバ関数test()に第2引数が追加された場合、どうなるでしょうか?
答えはstd::tr1::bindに引数を追加するだけです。
#include <list>
#include <algorithm>
#include <functional>
#include <tr1/memory>
#include <tr1/functional>

class Widget {
public:
  void test(int n, const char* text) {}
};

int main()
{
  using namespace std::tr1::placeholders;
  
  std::list<std::tr1::shared_ptr<Widget> > lspw;
  std::for_each(lspw.begin(), lspw.end(), std::tr1::bind(&Widget::test, _1, 0, ""));
  
  return 0;
}

人気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