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
というエラーになる。
[ツッコミを入れる]