0

我面临一个关于函数指针语法的问题。我以前用过这些,但我的情况让事情变得完全不明显了。

所以,我正在设计一个为游戏创建节点的工厂。工厂的 create 方法有 2 个重载,如下所示:

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

在工厂中,我有私有方法来处理创建过程(基于节点的类型),这是创建球的两种方法:

  • AbstractNode* createBall() 常量;
  • 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>)

提前致谢!

4

1 回答 1

2

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++ 中通常规则的一个特殊例外,即子表达式的类型&createBall不依赖于它出现的上下文。

我认为你应该能够避免演员阵容:

functors_[AbstractNode::NAME_BALL] = &createBall;

因为将指针分配给重载函数同样是一种特殊情况。但是我懒得去查了。

于 2013-04-18T17:29:03.180 回答