はコードです。私はstd::tr1::bind
とboost::bind
を試しましたが、ポインタではなく機能的なオブジェクトを返します。これは、わかりましたが、純粋な機能ポインタにキャストできません。ファンクションシグニチャ(SetupIterateCabinet
)は、純粋なfuncポインタを正確に要求します。のstd ::機能>ここでは関数ポインタ
私はこの問題を解決するための助言が必要です。ありがとうございました。
はコードです。私はstd::tr1::bind
とboost::bind
を試しましたが、ポインタではなく機能的なオブジェクトを返します。これは、わかりましたが、純粋な機能ポインタにキャストできません。ファンクションシグニチャ(SetupIterateCabinet
)は、純粋なfuncポインタを正確に要求します。のstd ::機能>ここでは関数ポインタ
私はこの問題を解決するための助言が必要です。ありがとうございました。
あなたは大幅にあなたの本当の問題を単純化し、XY problemにあなたの質問になってきました。 質問:コールバックとして非スタティックメンバー関数を使用してSetupIterateCabinet
を呼び出す方法を教えてください。
いくつかのクラスを考える:SetupIterateCabinet
に3番目の引数としてMyClass::MyCallback
を使用するためには
class MyClass
{
public:
UINT MyCallback(UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
{
/* impl */
}
};
を、あなたはContext
引数にMyClass*
を渡し、そのContext
引数を取り、行うために、プレーンシム機能を使用する必要があります
std::function
を関数ポインタに変換することはできません(逆も可能です)。関数ポインタ、またはstd::function
のいずれかを使用する必要があります。ポインタの代わりにstd::function
を使用することができれば、あなたはすべきです。
これはあなたのコードの作業を行います
typedef function<void(void)> fp;
私が追加する唯一のことは、std :: functionを使用するとoperator()がオーバーロードされた型を使用できることです。優れた答え。 –
彼は 'SetupIterateCabinet'(C API)を変更してC++オブジェクトを取得するように提案しますか? – ildjarn
@ildjarn "関数ポインタ、あるいは' std :: function'を使うべきです。もし彼が 'std :: function'を使うことができないなら、静的関数の周りに' std :: function'をラップしない限り、関数ポインタを使うべきですが、それはかなりうまくいかないでしょう。 – mfontanini
それは動作します、ありがとう! – fogbit