C++ typedef成员函数签名语法

0xb*_*00d 24 c++ typedef member-functions method-signature

我想声明成员函数签名的类型定义.全局函数typedef如下所示:

typedef int (function_signature)(int, int);
typedef int (*function_pointer) (int, int);
Run Code Online (Sandbox Code Playgroud)

但是我对成员函数不能做同样的事情:

typedef int (foo::memberf_signature)(int, int);   // memberf_pointer is not a member of foo
typedef int (foo::*memberf_pointer)(int, int);
Run Code Online (Sandbox Code Playgroud)

这对我来说听起来很合理,因为"foo ::"是访问类foo中成员的语法.我怎样才能输入签名?

Mat*_* M. 13

关于笨拙的函数指针语法的问题,我个人使用一个备忘单:功能指针教程(可在此下载,感谢Vector指出).

然而,正如您所经历的那样,成员函数的签名与常规函数的签名略有不同.

您可能知道,成员函数有一个隐藏参数,this需要指定其类型.

// C++11 and above.
using Member = int (Foo::*)(int, int);

// C++03 and below.
typedef int (Foo::*Member)(int, int);
Run Code Online (Sandbox Code Playgroud)

是否让你指定传递给函数的第一个元素将是一个Foo*(因此你的方法确实需要3个参数,当你想到它,而不只是2.

但是,还有另一个原因,强制您指定类型.

函数指针可能引用虚函数,在这种情况下,事情会变得非常复杂.因此,内存中表示的大小根据函数的类型而改变.实际上,在Visual Studio中,函数指针的大小可能在常规指针大小的1到4倍之间变化.这取决于功能是否是虚拟的,特别是.

因此,函数引用的类是签名的一部分,并且没有解决方法.


Nik*_*iou 7

您可以利用模板别名"typedefing"特性,在现代C++(第11篇)中分解目标类.你需要的是:

template<typename T>
using memberf_pointer = int (T::*)(int, int); 
Run Code Online (Sandbox Code Playgroud)

然而,在声明时,使用此语法的成员函数指针需要指定目标类:

// D is a member function taking (int, int) and returning int
memberf_pointer<foo> mp = &foo::D; 
Run Code Online (Sandbox Code Playgroud)