関数の戻り値の型(関数ポインタの方が良い)が何であるかを調べる方法はありますか?テンプレートのインスタンス化時に関数の戻り値の型を決定するにはどうすればよいですか?
私はvoid関数ポインタを使用すると壊れますが、他の戻り値の型ではうまく機能する次のコードがあります。 gcc 4.5のvoid関数ポインタを使用するとエラーが発生します。
error: void value not ignored as it ought to be
これは意味があります。関数ポインタが何かを返すかどうかを確認し、結果を取得して返す必要があることは明らかです。
template <class F,typename R> class Instruction
{
protected:
F (func);
R result;
public:
template <typename T>
Instruction(T const& f)
{
func = &f;
};
template <typename A> void execute(A const& a)
{
result = (func)(a);
};
template <typename A> void execute(A const& a,A const& b)
{
result = (func)(a,b);
};
template <typename A> void execute(A const& a,A const& b,A const& c)
{
result = (func)(a,b,c);
};
R get_result()
{
return result;
};
};
通常、何かほとんどが算術演算を行う関数へのポインタを使用し、void関数以外のインスタンス化では任意の戻り値型を処理できます。私は次のようにインスタンス化しようとしました:
Instruction<ptr2func2,void> foo(bar);
Instruction<ptr2func2,(*void)> foo(bar);
しかしどちらの場合も失敗します。
インスタンス化時の2番目のテンプレート引数は、戻り値の型を定義するために使用されます。
、あなただけの 'R'をチェックする必要があります。 – ikegami