gpt4 book ai didi

C++ 绑定(bind)回调到一个类

转载 作者:行者123 更新时间:2023-11-30 02:20:26 25 4
gpt4 key购买 nike

我在一个类中将回调注册到 HashMap 以处理各种“事件”,因此我使用 std::function 将它们存储在 HashMap 中我希望将回调绑定(bind)到类,以便它们可以访问一些常用方法,因此我使用 std::bind 来完成此操作。我不明白的是为什么第一个示例有效,但是当我尝试重构对 bindEvent 函数的 std::bind 调用时,编译失败。

所以这是可行的:

void MyClass::bindEvent(const QString event, std::function<QJsonObject(const QString &, const QJsonObject &)> handler)
{
mHandlers.insert(event.toLower(), handler);
}


void MyClass::registerAll()
{

this->bindEvent(QStringLiteral("do_something"), std::bind(&MyClass::doSomething, this, _1, _2));
this->bindEvent(QStringLiteral("do_something_else"), std::bind(&MyClass::doSomethingElse, this, _1, _2));
}

这失败了:

void MyClass::bindEvent(const QString event, std::function<QJsonObject(const QString &, const QJsonObject &)> handler)
{
mHandlers.insert(event.toLower(), std::bind(handler, this, _1, _2));
}


void MyClass::registerAll()
{

this->bindEvent(QStringLiteral("do_something"), &MyClass::doSomething);
this->bindEvent(QStringLiteral("do_something_else"), &MyClass::doSomethingElse);
}

错误信息:

../src/MyClass.cpp: In member function ‘virtual bool MyClass::registerAll()’:
../src/MyClass.cpp:124:388: error: no matching function for call to ‘MyClass::bindEvent(QString, QJsonObject (MyClass::*)(const QString&, const QJsonObject&))’
this->bindEvent(QStringLiteral("do_something"), &MyClass::doSomething);
^
../src/MyClass.cpp:124:388: note: candidate is:
../src/MyClass.cpp:109:6: note: void MyClass::bindEvent(QString, std::function<QJsonObject(const QString&, const QJsonObject&)>)
void MyClass::bindEvent(const QString event, std::function<QJsonObject(const QString &, const QJsonObject &)> handler)
^
../src/MyClass.cpp:109:6: note: no known conversion for argument 2 from ‘QJsonObject (MyClass::*)(const QString&, const QJsonObject&)’ to ‘std::function<QJsonObject(const QString&, const QJsonObject&)>’

散列本身声明为

QHash<const QString, std::function<QJsonObject(const QString &, const QJsonObject &)> > mHandlers;

最佳答案

第二次尝试失败,因为需要在对象上调用成员函数。当您传递指向成员函数的指针时,没有对象可以在其上调用该函数,因此无法将其转换为 std::function

您可以坚持现在正在做的事情,也可以在 bindEvent 中接受指向成员函数的指针。

void MyClass::bindEvent(const QString event, QJsonObject (MyClass::*handler)(const QString &, const QJsonObject &))
{
mHandlers.insert(event.toLower(), std::bind(handler, this, _1, _2));
}

这里要指出的另一件事是,不久前就建议使用 lambda 而不是 std::bind。根据我的理解,它为编译器提供了更好的机会来优化代码。

我个人也觉得它更具可读性。

void MyClass::bindEvent(const QString event, QJsonObject (MyClass::*handler)(const QString &, const QJsonObject &))
{
mHandlers.insert(event.toLower(), [&, handler](const QString& s, const QJsonObject& o){
this->*handler(s, o);
});
}

关于C++ 绑定(bind)回调到一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49669520/

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