【发布时间】:2018-09-15 02:36:00
【问题描述】:
我在一个类中注册一个哈希映射的回调来处理各种“事件”,所以我使用std::function将它们存储在哈希映射中
我希望将回调绑定到类,以便它们可以访问一些常用方法,因此我使用std::bind 来完成此操作。
我不明白为什么第一个示例有效,但是当我尝试重构 std::bind 对 bindEvent 函数的调用时,编译失败。
所以这行得通:
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;
【问题讨论】:
标签: c++ functional-programming std-function stdbind