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("hello, world"); => dlrow ,ollehとメッセージ表示される
ちなみに使ったのはC++ Builder 2010とXE4でboostは1.39。
よくわからない
| 固定リンク
「C/C++」カテゴリの記事
- コンピュータプログラミング言語調節可能おしゃれキャップ(2018.06.05)
- raspberry piでC++11を使えるようにする(2016.04.27)
- StrinToIntのような文字列を整数に変換する関数を実装してみる(2016.03.21)
- インライン化できない関数のラッパー関数などで関数呼び出しのオーバーヘッドを減らしたい(2016.03.03)
- C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す(2014.09.15)
「CBuilder」カテゴリの記事
- 一定時間アイドル状態が続いたら何かをしたい(2015.11.26)
- TMetafileへの描画が反映されない(2015.07.30)
- TDataModuleはClientHeightプロパティを持っていない(2015.02.19)
- VCLのTStringsを検索キーワードのトークナイザー的に使ってみる(2014.12.18)
- Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する(2014.12.02)
この記事へのコメントは終了しました。
コメント