首页 > 解决方案 > 如何理解 cls* (*) (int, double)

问题描述

我正在研究从互联网上抓取的一些源代码,并发现了一个混淆的句子。

map<int, Element* (*) (int, Domain*) > elemList

我的问题是关于 elemList 的价值部分。是指针吗?还是构造函数?还是别的?

此致

标签: c++visual-c++

解决方案


Element* (*) (int, Domain*)用于函数指针。这是两种类型。

  • 原始函数指针(类似于:)void (*foo)(int x, int y);
  • 成员函数指针(看起来像这样:)void (Object::*foo)(int x, int y);

在原始函数指针中,它由 3 个部分组成。让我们使用上面的例子,

  1. 返回类型(即void)。
  2. 函数名/指针名(即foo)。
  3. 函数参数(即(int x, int y))。

在成员函数指针中,它由 4 个部分组成。

  1. 返回类型(即void)。
  2. 哪个类/结构保存函数(即Object)。
  3. 函数名/指针名(即foo)。
  4. 函数参数(即(int x, int y))。

调用原始函数指针就这么简单,

void Func(int x, int y) { ... }

void (*foo)(int x, int y) = Foo;    // Assigning the function pointer.
foo();    // Calling the pointer.

调用成员函数指针略有不同。为此,您需要一个有效的对象实例。

class Object {
public:
    void Func(int x, int y) { ... }
};


void (Object::*foo)(int x, int y) = &Object::Func;    // Assigning the function pointer. Notice the '&' operator here.

Object object;
(object.*foo)();    // Calling the function pointer.

那么map<int, Element* (*) (int, Domain*) > elemList它的作用是存储映射到整数的原始函数指针映射。

附加:为了将函数分配给函数指针,这些东西应该匹配,

  • 返回类型。
  • 函数的参数。
  • 保存函数的对象(这仅适用于成员函数)。

推荐阅读