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

时间:2011-06-07 13:24:00

标签: c++ typedef

根据MSDN,typedef语法是:

  

typedef type-declaration同义词;

非常简单:

typedef int MY_INT;

但是成员函数指针typedef如何符合这条规则?

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

100%混淆 - 同义词(MyTypedef)位于中间?

有人可以解释一下从MSDN的非常容易理解的语法格式到上面的typedef的反向/随机/前/上/混合语法的逻辑步骤吗?

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

9 个答案:

答案 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; } 的实例):

  • 在声明中,使用“A ::”作为前缀
  • 使用时,请使用“a”。作为前缀

以下是玩具示例。你可以玩它。

<?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值。

希望它减少混乱。