web-dev-qa-db-ja.com

C ++ typedefメンバー関数のシグニチャー構文

メンバー関数のシグネチャの型定義を宣言したい。グローバル関数の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のメンバーにアクセスするための構文なので、論理的に聞こえます。どうすれば署名だけをtypedefできますか?

26
0xbadf00d

'typedefing' qualities of template aliasesを利用することで、最新のC++(post 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; 
6

わたしにはできる:

#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 ;
  }
2
TonyK

現在の構文で機能しない理由は、演算子の優先順位により、型ではなくfoo::memberf_signatureという名前の関数を参照しているためです。

これが可能かどうかはわかりませんが、コードをg ++ 4.2でコンパイルするための括弧の組み合わせは思いつきませんでした。

1
Mark B