我想将我的类方法作为参数传递给(第三方)函数
(listner – 无法更改)接受函数指针和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
}
};
不幸的是我的解决方案无法编译我需要改变什么?
最佳答案 从回调信号的外观来看,监听器API将指向void的指针作为“用户定义的数据”.您可以将此作为数据和一个小的无状态代理函数传递给Foo上的处理程序:
typedef void(*pfnc) (void*);
struct Foo
{
static void static_foo(void*)
{
}
void foo()
{
}
void listner(pfnc f, void* user_data)
{
// eventually calls
f(user_data);
}
void test()
{
listner(static_foo, nullptr); // works with static method
auto f = [](void*) {
};
listner(f, nullptr); // works with lambda
listner([](void* pv)
{
reinterpret_cast<Foo*>(pv)->foo();
}, this);
}
};