根据MSDN,typedef语法是:
typedef type-declaration同义词;
非常简单:
typedef int MY_INT;
但是成员函数指针typedef如何符合这条规则?
typedef int (MyClass::*MyTypedef)( int);
100%混淆 - 同义词(MyTypedef
)位于中间?
有人可以解释一下从MSDN的非常容易理解的语法格式到上面的typedef的反向/随机/前/上/混合语法的逻辑步骤吗?
*编辑感谢所有快速答案(以及美化我的帖子):)
答案 0 :(得分:36)
同义词(MyTypedef)位于中间??
它不在中间。只需忘记成员函数一段时间,看看如何定义函数指针:
int (*FuncPtr)(int);
这就是你要输入它的方式:
typedef int (*FuncPtr)(int);
简单!唯一的区别是,typedef FuncPtr
变为类型,而在指针声明中,FuncPtr
是变量。
类似地,
int (MyClass::*MyTypedef)( int); //MyTypedef is a variable
并且typedef为:
typedef int (MyClass::*MyTypedef)( int); //MyTypedef is a type!
答案 1 :(得分:15)
值得注意的是,从C ++ 11开始,您可以将此表达式编写为更清晰的using
语句:
using MyTypedef = int (MyClass::*)(int);
答案 2 :(得分:10)
如何定义指向成员函数的指针?像这样:
int (A::*variableName)(int);
要使其成为typedef,只需添加typedef:
typedef int (A::*typedefName)(int);
答案 3 :(得分:4)
C ++中声明的原则是它们模仿使用。如果你想使用指向成员函数pmf的指针,你会写:
(myVar.*pmf)(arg);
所以要为它定义一个typedef,你写:
typedef int (MyClass::*pmf)(int);
在head中添加返回类型,用类型和参数替换变量。
答案 4 :(得分:4)
我知道你已经得到了答案,但想分享一下 - 这很方便:http://www.cdecl.org。这是一个C / C ++声明< - >英语翻译。只需输入
即可将x声明为指向成员的指针 class A函数(int)返回char
你得到char (A::*x)(int )
。或者玩宣言,看看你是否得到了你想要的东西。
答案 5 :(得分:2)
使用成员函数指针的语法必须(假设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 = %d\n", (a.*f)(1));
// Below is equivalent to:
// F f2 = a.f_;
// printf("double of 1 = %d\n", (a.*f2)(1));
printf("double of 1 = %d\n", (a.*(a.f_))(1));
a.set(3);
printf("triple of 1 = %d\n", (a.*(a.f_))(1));
return 0;
}
的实例):
以下是玩具示例。你可以玩它。
<?php
$fName = DB::table('users')->pluck('first_name','pic');
echo $fName;
?>
答案 6 :(得分:1)
我曾经读过一个很好的解释(但它来自Expect C Programming所以我是ymmv):
实际上,一个typedef就是这样的 格式与变量声明相同, 只有这个额外的关键字才能提示 你离开了。
因为typedef看起来与a完全相同 变量声明,它被读取 完全像一个。而不是 宣言说“这个名字是指 对于所述类型的变量,“ typedef关键字不会创建 变量,但导致声明 说“这个名字是一个同义词 声明的类型。“
所以你有它。想象一下,你正在声明一个变量,在它之前坚持typedef
并且瞧,你有一个新类型。 MSDN
解释是一个混合包:我读过真正的上帝和坏的。
答案 7 :(得分:1)
您所指的网页可能是“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
关于可以找到什么声明说明符和init-declarator-list的更多细节here。
这是了解“typedef”所有可能用法的一种严格方法。
这个页面基本上说的是“typedef”可以在大多数有效声明之前使用。
答案 8 :(得分:0)
当你开始这样思考时,会更容易理解:
每当你看到这样的函数时:
TYPE foo(int arg1, int arg2);
你说foo的类型是TYPE。所以,
的类型int get_next_prime();
是int。
当您将函数指针作为参数传递给函数时,可以看到:
void register_callback(void (*ptr)(int));
在这种情况下,您传递的是void类型的函数作为参数。
现在,当你看到类似的东西时:
typedef int (A::*typedefName)(int);
你只是说变量(A :: * typedefName)(int)(这只是一件事,而不是两件,因为它是一个函数指针声明)实际上是int类型。从那时起,编译器会将A :: * typedefName解释为int类型的函数,即返回一个int值。
希望它减少混乱。