« 『リーダブルコード』(オライリー・ジャパン)が届いた | トップページ | スマートフォンのキャッシュを一発でクリアして空き容量を増やす »

2012-08-29

boost::bindに__fastcallを使う

#include <boost/bind.hpp>
より前に、
#define BOOST_MEM_FN_ENABLE_FASTCALL
を定義する。

#define BOOST_BIND_ENABLE_FASTCALL
を定義してしまうとエラーになるので、
BOOST_MEM_FN_ENABLE_FASTCALL
のみを定義する。

#define BOOST_MEM_FN_ENABLE_FASTCALL
#include <boost/function.hpp>
#include <boost/bind.hpp>
class FOO
{
public:
virtual int __fastcall func (int a, int b) { return a + b; }
};
class FOO_Ex : public FOO
{
public:
virtual int __fastcall func (int a, int b) { return a * b; }
};
FOO* foo = new FOO_Ex;
boost::function <int (int, int)> f = boost::bind (&FOO::func, foo, _1, _2);
ShowMessage (f (3, 7));

とすると、21とメッセージが表示される。
ちゃんと、インスタンスの型のメンバ関数がコールされる。

BOOST_MEM_FN_ENABLE_FASTCALLはメンバ関数に引数を束縛する時で、BOOST_BIND_ENABLE_FASTCALLは通常の関数に引数を束縛する時に使うみたいだ。

__fastcallの関数にbindするのにはBOOST_BIND_ENABLE_FASTCALLがなくても大丈夫っぽい。ただ、bindの型指定子に戻り値の型を指定してやったらうまくできた気がする。

function rev_msg = bind(&ShowMessage, bind(&ReverseString, _1));
rev_msg("hello, world"); => dlrow ,ollehとメッセージ表示される


ちなみに使ったのはC++ Builder 2010とXE4でboostは1.39。


よくわからない

|

« 『リーダブルコード』(オライリー・ジャパン)が届いた | トップページ | スマートフォンのキャッシュを一発でクリアして空き容量を増やす »

C/C++」カテゴリの記事

CBuilder」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: boost::bindに__fastcallを使う:

« 『リーダブルコード』(オライリー・ジャパン)が届いた | トップページ | スマートフォンのキャッシュを一発でクリアして空き容量を増やす »