(のリスナー - 変更することはできません)関数ポインタとvoid*
を受け入れます。以下は例です:バインドクラスメソッドと関数ポインタとして渡し、私は(サードパーティ)の引数の関数としての私のクラスのメソッドを渡したい
#include <functional>
typedef void(*pfnc) (void*);
struct Foo
{
static void static_foo(void*)
{
}
void foo(void*)
{
}
void listner(pfnc f, void* p)
{
f(p);
}
void test()
{
listner(static_foo); // works with static method
auto f = [](void*) {};
listner(f); // works with lambda
std::function<void(void*)> stdf = std::bind(&Foo::foo, this, std::placeholders::_1);
listner(stdf); // does not compile with not static method
}
};
残念ながら私の解決策はコンパイルされません。私は何を変えなければならないのですか?
関数ポインタに状態がありません。あなたは 'void *'パラメータを使わなければなりません。プラス面では、私が出会った他の特定のC APIとは異なり、パラメータが存在します。 – chris
'listener'メソッドが' pfnc'だけを受け入れることは確かですか?通常、このようなメソッドは、ハンドラメソッドへのコールバックの際に渡されるユーザ指定の 'void *'パラメータを受け取ります... –
私は通常、メソッドを呼び出すためにこれを取得するラムダを使用します。 –