c++ - 指向 STL 映射中函数的指针

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

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

因此,我正在设计一个为游戏创建节点的工厂。工厂的创建方法有 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/

相关文章:

c++ - 如何在 C/C++ 或 Cuda 中按对角线有效地按位翻转 char 数组?

c++ - 如何调用移动构造函数?

c++继承 - 具有不同参数类型的相同方法名称

c++ - 将函数指针实现替换为 std::function 以在 PlayFab SDK 中使用 lambda

c++ - 如何在 C++ 中模板化接受模板化参数并在其上应用模板化函数的函数?

C++如何存储模板对象的集合而不考虑模板

c++ - LLVM,获取内部结构的偏移量

c++ - 在 OpenCV 中为我检测到的对象制作动画

c++ - 文件如何进入 Visual Studio C++ 中的外部依赖项?

Python ctypes返回一个函数指针数组