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倍之间变化.这取决于功能是否是虚拟的,特别是.
因此,函数引用的类是签名的一部分,并且没有解决方法.
您可以利用模板别名的"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)