11

コードは次のとおりです。

#include <functional>
using namespace std::tr1;

typedef void(*fp)(void);

void foo(void)
{

}

void f(fp)
{

}

int main()
{
  function<void(void)> fun = foo;
  f(fun); // error
  f(foo); // ok
}

関数呼び出しの間にデータを保存する必要があるため、もともと非静的クラスメソッドから関数ポインターを作成する必要があります。std::tr1::bindとを試しboost::bindましたが、ポインターではなく機能オブジェクトを返します。これは、ご覧のとおり、純粋な機能ポインターに「キャスト」できません。関数シグネチャ ( SetupIterateCabinet) は、純粋な func ポインターを正確に要求します。

問題を解決する方法についてアドバイスが必要です。ありがとうございました。

4

2 に答える 2

8

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

これにより、コードが機能します。

typedef function<void(void)> fp;
于 2012-05-11T16:51:14.330 に答える
7

実際の問題を大幅に単純化しすぎて、質問をXY 問題に変えてしまいました。本当の質問に戻りましょう:SetupIterateCabinet非静的メンバー関数をコールバックとして呼び出す方法。

あるクラスを考えると:

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

MyClass::MyCallbackの 3 番目の引数としてを使用するには、引数にSetupIterateCabineta を渡し、単純な shim 関数を使用してその引数を取得し、それを使用して正しいことを行う必要があります。MyClass*ContextContext

UINT MyClassCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
{
    return static_cast<MyClass*>(Context)->MyCallback(Notification, Param1, Param2);
}

int main()
{
    MyClass mc;
    SetupIterateCabinet(_T("some path"), 0, MyClassCallback, &mc);
}
于 2012-05-11T17:01:39.017 に答える