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

时间:2011-01-28 19:31:18

标签: c++ typedef member-functions method-signature

我想声明成员函数签名的类型定义。全局函数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中成员的语法。 我怎样才能只输入签名?

5 个答案:

答案 0 :(得分:11)

关于笨拙的函数指针语法的问题,我个人使用了一个备忘单:The Function Pointers Tutorialdownloadable 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'未标准化......