簡體   English   中英

指向STL映射中的函數的指針

[英]Pointer to functions in a STL map

我遇到了關於函數指針語法的問題。 我之前使用過這些,但是我已經讓事情變得不再明顯了。

所以,我正在設計一個為游戲創建節點的工廠。 工廠的create方法有2個重載,如下所示:

  • AbstractNode * create(AbstractNode :: TYPE)const;
  • AbstractNode * create(AbstractNode :: TYPE,Vector3)const;

在工廠中,我有私有方法來處理創建過程(基於節點的類型)這里有兩個創建球的方法:

  • AbstractNode * createBall()const;
  • AbstractNode * createBall(Vector3)const;

最后這里是兩個映射,其中我存儲所有的函數指針。 這些映射會將調用重定向到正確的create方法(如果可能的話)

typedef AbstractNode* (*Functor)(void);
typedef AbstractNode* (*FunctorPosition)(Vector3);

map<unsigned int, Functor> functors_;
<unsigned int, FunctorPosition> functorsPosition_;

現在,我的問題是,在兩個映射中添加函數指針的語法是什么。

這是我的最后一次嘗試,它不會編譯並拋出以下錯誤:

functors_.insert(make_pair(AbstractNode::NAME_BALL, &createBall));

顯示錯誤:

No instance of function template std::make_pair matches the argument list
Argument types are (const unsigned int, <unkown-type>)

提前致謝!

createBall是一個非靜態成員函數。 指向成員的函數類型與指針到函數類型不同。

因此, &createBall的類型不是AbstractNode* (*)(void) ,它是AbstractNode* (Factory::*)(void)const ,其中Factory是它出現的類的名稱。如果你想要一個指針 - to-member-function然后更改類型Functor (並確保當你調用它時,你有一個Factory實例來調用它)。 如果需要指向函數的指針,則將createBall更改為靜態成員函數。

此外,編譯器無法計算出您要創建的對的類型,因為&createBall在名為createBall的兩個重載之間是不明確的。 一旦你的類型Functor正確,你可以寫:

functors_.insert(make_pair(AbstractNode::NAME_BALL, (Functor)&createBall));
functorsPosition_.insert(make_pair(AbstractNode::NAME_BALL, (FunctorPosition)&createBall));

演員告訴編譯器你指的是哪個函數 - 這是C ++中通常規則的特殊例外,即子表達式&createBall的類型不依賴於它出現的上下文。

我認為你應該能夠避免演員:

functors_[AbstractNode::NAME_BALL] = &createBall;

因為指向過載函數的指針同樣是一種特殊情況。 但我懶得檢查它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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