トップページ > 記事閲覧
メンパー関数対応型のSetASyncLoadFinishCallbackの要望
名前:名無三 日時: 2022/03/13 23:05

お世話になっております。 現状、voidポインターだとメンバー関数には対応できないため、もしよろしければ std::function を使用するSetASyncLoadFinishCallbackを要望したいです。
メンテ

Page: 1 |

Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.1 )
名前:管理人 日時:2022/03/14 02:17

すみません、C++の標準ライブラリの機能を使用すると、libファイルのバージョン間の互換性が 現在よりも低くなり、用意しなければならない libファイルの量が増大してしまうので、 こちらのような static なメンバー関数を介す方法でメンバー関数を呼ぶようにしてください m(_ _;m class CallbackTest { public: CallbackTest() : Loaded( false ) {} // 読み込み完了フラグ bool Loaded ; // コールバックで呼びたいメンバー関数 void CallbackFunction( int Handle ) { // 読み込み完了フラグを立てる Loaded = true ; } // SetASyncLoadFinishCallback に登録するコールバック関数 static void CallbackFunctionStatic( int Handle, void *Data ) { // コールバックで呼びたいメンバー関数を呼ぶ ( ( CallbackTest * )Data )->CallbackFunction( Handle ) ; } } ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 非同期読み込みON SetUseASyncLoadFlag( TRUE ) ; // 画像を非同期読み込み GrHandle = LoadGraph( "Test1.bmp" ) ; // 画像の非同期読み込みが終わったら呼ばれるコールバック関数を設定する CallbackTest ctest ; SetASyncLoadFinishCallback( GrHandle, CallbackTest::CallbackFunctionStatic, &ctest ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // 読み込み状況を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Loaded : %s", ctest.Loaded ? "true" : "false" ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.2 )
名前:通りすがり 日時:2022/03/15 17:15

ほぼ同じだけど,staticメンバ関数でなく //Handleを引数として,pObj が指す T 型オブジェクトの OnASyncLoadFinish メソッドを呼ぶ template< class T > void Call_OnASyncLoadFinish_Method( int Handle, void *pObj ){ ((T*)pObj)->OnASyncLoadFinish(Handle); } みたいなtemplateでどうでしょう. メソッド名が固定されているのがアレですが… (どうにかすればメソッド名の側も固定じゃなくてtemplateにできるのかもしれないけど,私にはムリ^^) あとはこれをコールバックに設定する記述を //コールバック設定のヘルパ //(このヘルパの関数名は思い浮かばないのでてきとー) template< class T > void SetASyncLoadFinishCallback_Helper( int Handle, T &Obj ) { SetASyncLoadFinishCallback( Handle, Call_OnASyncLoadFinish_Method<T>, &Obj ); } とか用意しとけばどうかな.
メンテ
Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.3 )
名前:通りすがり 日時:2022/03/16 14:51

> メソッド名の側も固定じゃなくてtemplateに こうか……? //Handleを引数として,pObj が指す T 型オブジェクトのメソッドMを呼ぶ template< class T, typename void(T::*M)(int) > void Call_Method( int Handle, void *pObj ) { ( static_cast<T*>(pObj)->*M )(Handle); } //T型のオブジェクト Obj のメソッド M がコールバックされる形に //↑の Call_Method を SetASyncLoadFinishCallback() に指定するヘルパ template< class T, typename void(T::*M)(int) > void SetASyncLoadFinishCallback_Helper( int Handle, T &Obj ) { SetASyncLoadFinishCallback( Handle, Call_Method<T,M>, &Obj ); } --- 使う側: //このTest型の Method をコールバックに使いたいのだとして… class Test { public: void Method(int Handle){ std::cout << "Test::Method(" << Handle << ")\n"; } }; //こんな感じか int Handle = (略); Test Obj; SetASyncLoadFinishCallback_Helper< Test, &Test::Method >( Handle, Obj );
メンテ
Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.4 )
名前:名無三(解決) 日時:2022/03/19 12:44

>管理人さん、通りすがりさん ありがとうございます、参考にします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存