![](/img/trans.png)
[英]How does std::function makes pointer pointing to a member function work?
[英]std::function does not work, but plain old function pointer does - why?
我想創建一個將std::function
作為參數的std::function
,並在內部調用傳遞函數:
void handleCollision(std::function<void(const Entity&)>& resolveCollision, const Entity& block) {
if (playerInRangeOf(block) && playerIntersects(block)) {
resolveCollision(block);
}
}
和調用者(在同一個類中):
for (auto&& block : blocks) {
handleCollision(resolveCollisionAxisX, block);
}
錯誤:
Reference to non-static member function must be called
error: no matching function for call to 'StateGame::handleCollision(<unresolved overloaded function type>, Block&)'
handleCollision(resolveCollisionAxisX, block);
^
但是,如果我遵循 C 風格的函數指針:
void handleCollision(void (StateGame::*resolveCollision)(const Entity&), const Entity& block) {
if (playerInRangeOf(block) && playerIntersects(block)) {
(this->*resolveCollision)(block);
}
}
然后它工作正常(調用者是相同的)。
我怎樣才能使std::function
工作? 旁注:我不想讓任何事情變得靜態。
將其包裹在 lambda 中,替換
handleCollision(resolveCollisionAxisX, block)
到
[this](const Entity& e){
this->resolveCollisionAxisX(e);
}
也將std::function<void(const Entity&)>&
替換為std::function<void(const Entity&)>
或const std::function<void(const Entity&)>&
C++ 成員函數是普通的 C 函數,增加了實例地址作為第一個參數。
例如,編譯器的void StateGame::resolveCollisionAxisX(const Entity&)
等價於void resolveCollisionAxisX(StateGame* instance, const Entity&)
這是一個顯示工作示例的小代碼片段。 看看std::function
模板參數如何是void(A*)
而不僅僅是void()
。
#include <iostream>
#include <functional>
struct A{
void foo1(void(A::*resolveCollision)(void)){
std::cout << "foo [c-style]" << std::endl;
(this->*resolveCollision)();
}
void foo2(std::function<void(A*)> resolveCollision) {
std::cout << "foo [std::function]" << std::endl;
resolveCollision(this);
}
void target() {
std::cout << "resolve" << std::endl;
}
void caller() {
std::cout << "caller" << std::endl;
foo1(&A::target);
foo2(&A::target);
}
};
int main() {
A a;
a.caller();
}
如果你懂 Python,那么這個概念就更明確了,事實上,所有成員函數都有self
作為第一個參數(這是 C++ 中this
另一個自我)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.