带有成员函数指针的 typedef 语法

typedef syntax with member function pointers

本文关键字:typedef 语法 指针 函数 成员      更新时间:2023-10-16

根据 MSDN,typedef 语法为:

typedef 类型声明同义词;

非常简单:

typedef int MY_INT;

但是成员-函数-指针类型定义到底如何遵守这个规则呢?

typedef int (MyClass::*MyTypedef)( int);

100%混淆 – 同义词(MyTypedef(在中间?

有人可以解释一下从MSDN非常易于理解的语法格式到上述typedef的反向/随机/正面/最后/混合语法的逻辑步骤是什么?

*编辑感谢所有快速答案(以及美化我的帖子(:)

同义词(MyTypedef(在中间??

它不在中间。 暂时忘记成员函数,看看函数指针是如何定义的:

int (*FuncPtr)(int);

这就是你如何键入它:

typedef int (*FuncPtr)(int); 

简单!唯一的区别是,在 typedef 中FuncPtr成为类型,而在指针声明中,FuncPtr 是一个变量

同样地

int (MyClass::*MyTypedef)( int); //MyTypedef is a variable

而类型定义为:

typedef int (MyClass::*MyTypedef)( int); //MyTypedef is a type!
值得注意的是

,从 C++11 开始,您可以将此表达式编写为更清晰的using语句:

using MyTypedef = int (MyClass::*)(int);

如何定义指向成员函数的指针?喜欢这个:

int (A::*variableName)(int);

要使其成为 typedef,只需添加一个 typedef:

typedef int (A::*typedefName)(int);
我知道

你已经得到了答案,但想分享这个 - 它很方便:http://www.cdecl.org。这是一个 C/C++ 声明<->英语翻译器。只需输入

将 x 声明为指向 成员的指针 A 类函数 (int( 返回字符

你会得到char (A::*x)(int ).或者玩弄宣言,看看你是否得到了你想要的。

使用成员函数指针的语法必须为 (假设a是类 A 的实例(:

  • 在声明中,使用"A::"作为前缀
  • 使用它时,请使用"a."作为前缀

下面是一个玩具示例。你可以玩它。

#include <stdio.h>
#include <stdlib.h>
class A;
typedef int (A::*F)(double);
class A {
 public:
  int funcDouble(double x) { return (int)(x * 2.0); }
  int funcTriple(double x) { return (int)(x * 3.0); }
  void set(int a) {
    if (a == 2) {
      this->f_ = &A::funcDouble;
    } else if (a == 3) {
      this->f_ = &A::funcTriple;
    } else {
      this->f_ = NULL;
    }
  }
 public:
  F f_;
};
int main(int argc, char *argv[]) {
  A a;
  a.set(2);
  F f = &A::funcDouble;
  printf("double of 1 = %dn", (a.*f)(1));
  // Below is equivalent to:
  // F f2 = a.f_;
  // printf("double of 1 = %dn", (a.*f2)(1));
  printf("double of 1 = %dn", (a.*(a.f_))(1));
  a.set(3);
  printf("triple of 1 = %dn", (a.*(a.f_))(1));
  return 0;
}

C++声明的原则是它们模仿使用。 如果要使用指向成员函数 pmf 的指针,请编写:

(myVar.*pmf)(arg);

因此,要为它定义一个 typedef,您可以编写:

typedef int (MyClass::*pmf)(int);

在 head 中添加返回类型,将变量替换为类型,将参数替换为其类型。

我曾经读过一个很好的解释(但它来自Expect C Programming,所以我ymmv(:

事实上,typedef 具有 与变量声明相同的格式, 只有这个额外的关键字才能提示 你走了。

由于 typedef 看起来完全像 变量声明,读取 一模一样。而不是 声明说"这个名字指的是 到所述类型的变量," typedef 关键字不会创建 变量,但导致声明 说"这个名字是 说明类型。

所以你有它。想象一下,你正在声明一个变量,在它之前坚持typedef,瞧,你有一个新的类型。 MSDN解释好坏参半:我读过真正的上帝和彻头彻尾的坏人。

你所指的页面可能是"typedef Specifier"。简单的"typedef type-declaration synonim;"语法只是使用typedef的众多方法之一。(可能(没有简单简洁的方法来描述如何使用 typedef。这就是"Typedef Declarations"MSDN 页面的用途。

您会在此页面上注意到以下内容:

declaration: 
    declaration-specifiers init-declarator-list opt ; 
declaration-specifiers: 
    storage-class-specifier declaration-specifiers opt 
    type-specifier declaration-specifiers opt
    type-qualifier declaration-specifiers opt 
storage-class-specifier: 
    typedef

有关声明说明符和初始化声明符列表的更多详细信息,请参见此处。

这是理解"typedef"所有可能用法的一种严格方法。

这个页面基本上说的是"typedef"可以在大多数有效的声明之前使用。

当你开始这样思考时,会更容易理解:

每当你看到这样的函数时:

TYPE foo(int arg1, int arg2);

你说foo的类型是TYPE。所以,类型

int get_next_prime();

是整数。

您可以看到,当您将函数指针作为参数传递给函数时:

void register_callback(void (*ptr)(int));

在本例中,您将传递 void 类型的函数作为参数。

现在,当你看到类似的东西时:

typedef int (A::*typedefName)(int);

你只是说变量(A::*typedefName((int((这只是一件事,而不是两件事,因为它是一个函数指针声明(实际上是int类型。从那时起,编译器会将 A::*typedefName 解释为 int 类型的函数,即返回一个 int 值。

希望它能减少混乱。