我遇到了一个关于函数指针语法的问题。我以前用过这些,但我的情况让事情变得完全不明显了。
因此,我正在设计一个为游戏创建节点的工厂。工厂的创建方法有 2 个重载,如下所示:
- AbstractNode* 创建(AbstractNode::TYPE)常量;
- AbstractNode* create(AbstractNode::TYPE, Vector3) const;
在工厂中,我有私有(private)方法来处理创建过程(基于节点的类型),这里有两个创建球的方法:
- AbstractNode* createBall() const;
- AbstractNode* createBall(Vector3) const;
最后是我存储所有函数指针的两个映射。这些映射会将调用重定向到正确的创建方法(当然如果可能的话)
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
是它所在的类的名称。如果您想要指向成员函数的指针,则更改类型 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++ 中通常规则的一个特殊异常(exception),即子表达式 &createBall
的类型不依赖于它出现的上下文。
我认为你应该能够避免强制转换:
functors_[AbstractNode::NAME_BALL] = &createBall;
因为将指针赋值给重载函数同样是一种特殊情况。但是我懒得去查了。
关于c++ - 指向 STL 映射中函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089305/