Ich mag würde meine Klassenmethode als Argument für eine (Fremd) Funktion (listner -, die nicht geändert werden kann) zu übergeben, die einen Funktionszeiger und eine void*
akzeptiert . Es folgt ein Beispiel:Bind Klassenmethode und geben sie als Funktionszeiger
#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
}
};
Leider kompiliert meine Lösung nicht. Was muss ich ändern?
Funktionszeiger haben keinen Status. Sie müssen den 'void *' Parameter verwenden. Auf der positiven Seite existiert der Parameter, im Gegensatz zu einigen anderen spezifischen C APIs, die mir begegnet sind. – chris
Sind Sie sicher, dass die 'listener' Methode nur' pfnc' akzeptiert? Normalerweise akzeptieren solche Methoden einen vom Benutzer angegebenen 'void *' - Parameter, der während des Callbacks an die Handler-Methode übergeben wird. –
Normalerweise verwende ich ein Lambda, das dies erfasst, um die Methode aufzurufen. –