« 2012年7月 | トップページ | 2012年9月 »

2012年8月の1件の記事

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。


よくわからない

| | コメント (0) | トラックバック (0)

« 2012年7月 | トップページ | 2012年9月 »