指向STL映射中的函数的指针

时间:2013-04-18 17:17:09

标签: c++ visual-c++ function-pointers

我遇到了关于函数指针语法的问题。我之前使用过这些,但是我已经让事情变得不再明显了。

所以,我正在设计一个为游戏创建节点的工厂。工厂的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>)

提前致谢!

1 个答案:

答案 0 :(得分:2)

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;

因为指向重载函数的指针同样是一种特殊情况。但是我懒得检查它。