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

这取决于你想做什么。体内的

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

如果您调用 T 是您的函数的类型foo(my_function)。您的问题无法使用 c++03-features 解决,否则decltype不会添加到核心语言中。

于 2012-07-05T15:01:29.563 回答
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 回答