繁体   English   中英

没有可行的重载'='来分配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 '='错误提示,其中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::functionTouch*, 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的调用的直接替代。 在这里,我们将参数自动转发给调用的方法,而不必显式列出它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM