operator()
クラスに設定されたオプションに基づいて、いくつかの異なる方法をクラスに実装したいと考えています。これは何度も呼び出されるため、分岐するものは使用したくありません。理想的にはoperator()
、メソッドで設定できる関数ポインタです。ただし、これが実際にどのように見えるかはわかりません。私は試した:
#include <iostream>
class Test {
public:
int (*operator())();
int DoIt1() {
return 1;
}
int DoIt2() {
return 2;
}
void SetIt(int i) {
if(i == 1) {
operator() = &Test::DoIt1;
} else {
operator() = &Test::DoIt2;
}
}
};
int main()
{
Test t1;
t1.SetIt(1);
std::cout << t1() << std::endl;
t1.SetIt(2);
std::cout << t1() << std::endl;
return 0;
}
別の関数ポインターを作成し、operator()
関数からそれを呼び出すと、それが機能することはわかっています。しかし、operator()
関数自体を関数ポインタにすることは可能ですか? 私が投稿したものに沿ったもの(コンパイルされません)?
上記のコードは次のようになります。
test.cxx:5:21: エラー: 'operator()' を非関数として宣言
test.cxx: メンバー関数 'void Test::SetIt(int)':
test.cxx:17:16: エラー: 'operator()' が定義されていません
test.cxx:19:16: エラー: 'operator()' が定義されていません
test.cxx: 関数 'int main()' 内:
test.cxx:30:19: エラー: '(Test) ()' の呼び出しに一致しません</p>
test.cxx:34:19: エラー: '(Test) ()' の呼び出しに一致しません</p>