簡體   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