没有可行的重载"="来分配 std::function 回调作为成员函数
No viable overloaded '=' for assigning std::function callback as member function
我正在尝试将成员函数挂接到std::function
回调。回调类型为:
std::function<void(Touch*, Event*)>
我的成员函数是:
void Game::onTouchEnded(Touch* touch, Event* event)
当我尝试使用以下方式分配回调时:
listener->onTouchEnded = bind(&Game::onTouchEnded, this);
我在几个候选人中遇到No viable overloaded '='
错误。以下是我认为最相关的细节:
Candidate function not viable: no known conversion from
'__bind<void (Game::*)(cocos2d::Touch *, cocos2d::Event *), Game *>'
to
'std::__1::function<void (cocos2d::Touch *, cocos2d::Event *)>'
for 1st argument`
我已经尝试了几种不同的 bind(( 安排,但我不确定错误告诉我什么。这些类型在参数和返回值方面似乎都是正确的,所以我不确定为什么它不接受它?
尝试
listener->onTouchEnded = bind(&Game::onTouchEnded, this, std::placeholders::_1, std::placeholders::_2);
或尝试使用 lambda 函数
listener->onTouchEnded = [this](Touch* touch, Event* event){ this->onTouchEnded(touch, event); };
必须告诉bind
如何处理传递给其返回值的参数。 默认情况下,它只是丢弃它们。
当您将其传递给std::function
时,它会尝试键入擦除它。 std::function
将Touch*, Event*
传递给bind
。 bind
的返回值会丢弃它们,并按照您的请求调用 (this->*&Game::onTouchEnded)()
。 这不是有效的调用,并且您会收到错误。
解决此问题的简单方法是添加占位符,说明"如何处理绑定返回值的参数"。 bind
将成员函数视为首先接受额外this
参数的函数。 你想要:
(this->*&Game::onTouchEnded)(_1, _2)
分别是:
std::bind(&Game::onTouchEnded, this, _1, _2)
现在这一切都很好,但实际上你应该避免std::bind
. 完全理解它是很棘手的:当你递归调用它时,它有奇怪的角落情况,可能会咬你,或者迫使你不必要地键入擦除。
相反,请使用 lambda。 在 C++11 中,它看起来像:
[this](Touch* touch, Event* event){return this->onTouchEnded(touch, event);}
在 C++14 中,替代方案是:
[this](auto&&args)->decltype(auto){return this->onTouchEnded(decltype(args)(args)...);}
甚至:
template<class T, class M>
auto bind_method( T* t, M* m ) {
return [t, m](auto&&...args)->decltype(auto){
return (t->*m)(decltype(args)(args)...);
};
}
可以这样使用:
bind_method(this, &Game::onTouchEnded)
并且是您呼叫bind
的直接替代品。 在这里,我们自动将参数转发到我们调用的方法,而不必显式列出它们。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 使用 void 函数作为回调,从 "std::function<void ()>?
- 使用 boost::bind 和 boost::function 将成员函数分配给回调
- Alterantive for 回调使用 std::function
- 没有可行的重载"="来分配 std::function 回调作为成员函数
- 使用std::function和std::bind来存储回调并处理对象删除
- 透明地配置std::function / lambda回调
- 回调(std::function/std::bind)与接口(抽象类)的优缺点