[英]Pointer to functions in a STL map
我遇到了關於函數指針語法的問題。 我之前使用過這些,但是我已經讓事情變得不再明顯了。
所以,我正在設計一個為游戲創建節點的工廠。 工廠的create方法有2個重載,如下所示:
在工廠中,我有私有方法來處理創建過程(基於節點的類型)這里有兩個創建球的方法:
最后這里是兩個映射,其中我存儲所有的函數指針。 這些映射會將調用重定向到正確的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.