我想声明成员函数签名的类型定义。全局函数typedef如下所示:
typedef int (function_signature)(int, int);
typedef int (*function_pointer) (int, int);
但是我对成员函数不能做同样的事情:
typedef int (foo::memberf_signature)(int, int); // memberf_pointer is not a member of foo
typedef int (foo::*memberf_pointer)(int, int);
这对我来说听起来很合理,因为“foo ::”是访问类foo中成员的语法。 我怎样才能只输入签名?
答案 0 :(得分:11)
关于笨拙的函数指针语法的问题,我个人使用了一个备忘单:The Function Pointers Tutorial(downloadable here,感谢Vector指出它。)
然而,成员函数的签名与常规函数的签名略有不同,正如您所经历的那样。
您可能知道,成员函数有一个隐藏参数this
,需要指定其类型。
// C++11 and above.
using Member = int (Foo::*)(int, int);
// C++03 and below.
typedef int (Foo::*Member)(int, int);
允许您指定传递给函数的第一个元素是Foo*
(因此,当您想到它时,您的方法确实需要3个参数,而不仅仅是2。
然而,还有另一个原因,强迫您指定类型。
函数指针可能引用虚函数,在这种情况下,事情会变得非常复杂。因此,内存中表示的 size 会根据函数的类型而改变。实际上,在Visual Studio中,函数指针的大小可能在常规指针大小的1到4倍之间变化。这取决于该功能是否是虚拟的,尤其是。
因此,函数引用的类是签名的一部分,并且没有解决方法。
答案 1 :(得分:6)
您可以使用模板别名的'typedefing'品质来分解现代C ++(第11篇)中的目标类。您需要的内容如下:
template<typename T>
using memberf_pointer = int (T::*)(int, int);
然而,在声明时,使用此语法的成员函数指针需要指定目标类:
// D is a member function taking (int, int) and returning int
memberf_pointer<foo> mp = &foo::D;
答案 2 :(得分:2)
它对我有用:
#include <iostream>
class foo
{
public:
int g (int x, int y) { return x + y ; }
} ;
typedef int (foo::*memberf_pointer)(int, int);
int main()
{
foo f ;
memberf_pointer mp = &foo::g ;
std::cout << (f.*mp) (5, 8) << std::endl ;
}
答案 3 :(得分:1)
它无法使用当前语法的原因是运算符优先级指示您指的是名为foo::memberf_signature
的函数,而不是任何类型的函数。
我不确定你是否可以这样做,但是我无法想出任何导致代码用g ++ 4.2编译的括号组合。
答案 4 :(得分:-3)
基本上它不起作用(至少我知道使用g ++没办法); 使用borland c ++编译器会有__closure关键字。
它不编译的原因是,functionpointer(在x86机器上)的大小总是占用&lt;&lt;&lt; 32bits&gt;&gt ;;但是如果你想指向一个类(接口)签名,sizeof必须是64位:这个指针是32位(因为类接口只在内存中一次)而32位是实际函数
但__closure关键字是bcb语言'hack'未标准化......