gpt4 book ai didi

c++ - 绑定(bind)类方法并将其作为函数指针传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:40 27 4
gpt4 key购买 nike

我想将我的类方法作为参数传递给(第三方)函数 (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 的指针作为“用户定义的数据”。您可以将 this 作为数据和一个小型无状态代理函数传递给 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);
}

};

关于c++ - 绑定(bind)类方法并将其作为函数指针传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46692946/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com