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
というエラーになる。