メモの日々


2014年01月21日(火) [長年日記]

[c++] メンバ関数へのポインタを返す関数

C++でメンバ関数へのポインタを返す関数を書こうとしたんだけど、そのまま書くとコンパイルエラーになってしまった。

  • typedefを使う
  • C++11の新しい関数宣言記法を使う

とすれば書けたけど、そのまま書く方法が分からない。

#include <iostream>

using std::string;

struct A {
  string repeat(const string& s) const { return s + " " + s; }
};

// エラーになってしまう
//string ((A::* f0)(const string&) const)() { return &A::repeat; }

// typedefを使えばOK
typedef string (A::* F)(const string&) const;
F f1() { return &A::repeat; }

// C++11での新記法でもOK
auto f2() -> string (A::*)(const string&) const { return &A::repeat; }

int main() {
  A a;
  //std::cout << (a.*f0())("f0") << std::endl;
  std::cout << (a.*f1())("f1") << std::endl;
  std::cout << (a.*f2())("f2") << std::endl;
}

コメントアウトしている箇所を生かしてg++ 4.4.7でコンパイルすると

func_ptr.cpp:10: error: ‘f0’ declared as function returning a function
func_ptr.cpp:10: error: expected primary-expression before ‘return’
func_ptr.cpp:10: error: expected ‘}’ before ‘return’
func_ptr.cpp:10: error: expected declaration before ‘}’ token

というエラーになる。