私は頭の中で十分に単純なアイデアに頭を悩ませていますが、C++で実装する方法がわかりません。
通常、次の簡単な例のように、変換演算子を使用してクラスを宣言できます。
class Foo
{
private:
int _i;
public:
Foo( int i ) : _i(i) { }
operator int( ) const
{
return i;
}
};
だから今、私は次のような素晴らしいものを書くことができます
int i = Foo(3);
しかし、私の特定のケースでは、オブジェクトを関数ポインターに変換するための演算子を提供したいと思います(たとえば、Bar
インスタンスをint(*)(int, int)
関数ポインターに変換する)。これが私が最初に試したことです:
class Bar
{
private:
int (*_funcPtr)(int, int);
public:
Bar( int (*funcPtr)(int, int) ) : _funcPtr(funcPtr) { }
operator int(*)(int, int) ( ) const
{
return _funcPtr;
}
};
しかし、演算子関数はコンパイルに失敗し、次のエラーが生成されます。
expected identifier before '*' token
'<invalid-operator>' declared as a function returning a function
リターンタイプを括弧で囲むなど、上記の簡単なバリエーションも試しましたが、これらのアイデアもすべて失敗しました。
関数ポインターへの変換演算子メソッドを宣言するための構文が何であるか、またはそれが可能であるかどうかを誰かが知っていますか?
注:GCC4.5.2を使用してCode::Blocksでこれをコンパイルしています。新しいC++0xの概念のいくつかに関する回答も歓迎します。
編集
例を単純化するための努力の中で、私は意図せずに1つの詳細を省略しました。少し奇妙ですが、厳密にポインタを返すのではなくint(*)(int,int)
、変換演算子はテンプレート化することを目的としています。
template<typename ReturnType, typename ArgType1, typename ArgType2>
operator ReturnType(*)(ArgType1, ArgType2) ( ) const
{
// implementation is unimportant here
}
私の知る限り、そのような型をtypedefすることはできなくなりました。これは明らかに物事をはるかに不器用にしますが、まだ方法があることを願っています。