gpt4 book ai didi

qt - 如何使用bind将成员函数作为函数指针传递?

转载 作者:行者123 更新时间:2023-12-02 00:36:31 24 4
gpt4 key购买 nike

我试图将成员函数作为函数指针传递,这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息。据我所知,我的 std::function 是类型正确,它具有正确的签名,并且绑定(bind)应该允许我插入隐式 this 指针,本质上将成员函数传递为全局/无主函数。

void ProgramMessageHandler::setAsMessageHandlerForProgram() {
std::function<void(QtMsgType, const QMessageLogContext &, const QString &)> funcPtr;

funcPtr = std::bind(handleMessages, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);

qInstallMessageHandler(funkPtr);
}

这不能编译。我可以成功创建 funcPtr 变量,但将其传递到 qInstallMessageHandler 函数会导致以下结果:

log\ProgramMessageManager.cpp:16: error: cannot convert 'std::function<void(QtMsgType, const QMessageLogContext&, const QString&)>' to 'QtMessageHandler {aka void (*)(QtMsgType, const QMessageLogContext&, const QString&)}' for argument '1' to 'void (* qInstallMessageHandler(QtMessageHandler))(QtMsgType, const QMessageLogContext&, const QString&)'
oldHandler = qInstallMessageHandler(hackedPointerToHandleFunction);
^

我已阅读:

how to pass a member function as a function pointer?

How do you pass a member function pointer?

How to pass a member function as a parameter to a function that doesn't expect it?

Get function pointer from std::function when using std::bind

但没有人帮助我。

编辑:

所以有人说,如果没有单例或全局函数,这是不可能的......但为什么呢?具有相同签名的成员函数和全局函数之间的唯一区别是它们具有相同的签名,有一个隐式的this指针作为第一个参数到成员函数。

知道了这一点,为什么我不能使用 std::bind 来弥补这个差距,通过说“我知道被调用的函数在所有的之前接受 this 参数”其他人,将其强制放在那里,成为了解this的东西。这比单例要干净得多,而全局函数就是垃圾。

最佳答案

您正在尝试传递一个需要函数指针类实例,但不存在此类转换。

你可以这样做:

class ProgramMessageHandler
{
static void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
};

在main.cpp中(例如):

...
qInstallMessageHandler(ProgramMessageHander::myMessageHandler);
...

您可能仍然需要处理单例类中的一些问题,但我认为有一个消息处理程序或至少一个调度程序可以以某种方式将不同的消息重定向到适当的处理程序是有意义的。希望这有帮助

关于qt - 如何使用bind将成员函数作为函数指针传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32583771/

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