带有成员函数指针的 typedef 语法
typedef syntax with member function pointers
根据 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 值。
希望它能减少混乱。
- 这个typedef和转换运算符语法是什么意思
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- cppcheck:使用 /typedef 的语法错误
- 返回没有 typedef 的成员函数指针的语法是什么?
- 奇怪的语法构造 - 应用于 typedef 的运算符 () 使用 VS2015 成功编译
- 这个 typedef 语句中的语法在做什么
- 函数指针typedef的语法是什么
- 难道没有人一劳永逸地解释typedef的语法吗?
- 为什么在间接使用基类 typedef 时不断出现语法错误,而直接使用它就可以了?
- typedef T类型::*语法
- C++语法:使用typedef进行类型转换
- 数组类型的 typedef 语法是什么?
- 使用typedef进行语法解释
- C++语法/语义问题:对Function和typedef关键字的引用
- 只有typedef的c++结构语法的含义
- Typedef警告和语法错误LPINPUT
- 带有成员函数指针的 typedef 语法
- typedef的语法错误
- typedef 结构语法
- 这个 typedef 语法是如何工作的..