1

重複の可能性:
関数を呼び出さずに戻り値の型を抽出する (テンプレートを使用しますか?)

これから始めます(他の誰かによって提供されます):

int my_function(int, int *, double);

私はこれに行きたい:

typedef boost::function_types::result_type< my_function_type >::type my_result;
typedef boost::function_types::parameter_types< my_function_type >::type my_parameters;

どうすれば入手できmy_function_typeますか?

注: については知ってBOOST_TYPEOF()いますが、「おそらく完全に移植可能ではない」というように、少し怖いように見えますか?

4

3 に答える 3

3

decltype. 例:

char foo(int) {}
decltype (foo(3)) const *frob = "hello foo";
typedef decltype (foo(3)) typeof_foo;
using typeof_foo = decltype(foo(3));

式 todecltypeはコンパイル時に評価されるため、解決可能でなければなりません。constexpr任意の整数を渡すことができます。

于 2012-07-05T15:00:44.510 に答える
1

これがテンプレートマジックBoostです(関係ありません):

template <typename ReturnType> class clFunc0
{
    typedef ReturnType ( *FuncPtr )();
public:
    typedef ReturnType Type;
};

template <typename ReturnType> inline clFunc0<ReturnType> ResultType( ReturnType ( *FuncPtr )() )
{
    return clFunc0<ReturnType>();
}

#define FUNC_TYPE( func_name ) decltype( ResultType( &func_name ) )::Type

int test()
{
    return 1;
}

int main()
{
    FUNC_TYPE( test ) Value = 1;

    return Value;
}

そしてそれを経由してコンパイルします

gcc Test.cpp -std=gnu++0x
于 2012-07-05T16:57:45.133 に答える
1

それはあなたが何をしたいかによります。の体内には

template <typename T>
void foo(T )
{
  // ...
}

を呼び出す場合、 T は関数の型ですfoo(my_function)。あなたの問題は、c++03-features を使用して解決することはできません。そうdecltypeしないと、コア言語に追加されませんでした。

于 2012-07-05T15:01:29.563 に答える