簡體   English   中英

std::function 不起作用,但普通的舊函數指針起作用 - 為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM