2012-05-11 13 views
10

はコードです。私はstd::tr1::bindboost::bindを試しましたが、ポインタではなく機能的なオブジェクトを返します。これは、わかりましたが、純粋な機能ポインタにキャストできません。ファンクションシグニチャ(SetupIterateCabinet)は、純粋なfuncポインタを正確に要求します。のstd ::機能>ここでは関数ポインタ

私はこの問題を解決するための助言が必要です。ありがとうございました。

答えて

7

あなたは大幅にあなたの本当の問題を単純化し、XY problemにあなたの質問になってきました。 質問:コールバックとして非スタティックメンバー関数を使用してSetupIterateCabinetを呼び出す方法を教えてください。

いくつかのクラスを考える:SetupIterateCabinetに3番目の引数としてMyClass::MyCallbackを使用するためには

class MyClass 
{ 
public: 
    UINT MyCallback(UINT Notification, UINT_PTR Param1, UINT_PTR Param2) 
    { 
     /* impl */ 
    } 
}; 

を、あなたはContext引数にMyClass*を渡し、そのContext引数を取り、行うために、プレーンシム機能を使用する必要があります

+0

それは動作します、ありがとう! – fogbit

8

std::functionを関数ポインタに変換することはできません(逆も可能です)。関数ポインタ、またはstd::functionのいずれかを使用する必要があります。ポインタの代わりにstd::functionを使用することができれば、あなたはすべきです。

これはあなたのコードの作業を行います

typedef function<void(void)> fp; 
+0

私が追加する唯一のことは、std :: functionを使用するとoperator()がオーバーロードされた型を使用できることです。優れた答え。 –

+4

彼は 'SetupIterateCabinet'(C API)を変更してC++オブジェクトを取得するように提案しますか? – ildjarn

+0

@ildjarn "関数ポインタ、あるいは' std :: function'を使うべきです。もし彼が 'std :: function'を使うことができないなら、静的関数の周りに' std :: function'をラップしない限り、関数ポインタを使うべきですが、それはかなりうまくいかないでしょう。 – mfontanini

関連する問題