在C ++中,如何从声明中获取任意函数的类型?

时间:2012-07-05 14:41:43

标签: c++ templates boost c++11 metaprogramming

  

可能重复:
  Extract the return type of a function without calling it (using templates?)

从此开始(由其他人提供):

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(),但它似乎有点可怕,就像“也许不是完全可移植”一样?

3 个答案:

答案 0 :(得分:3)

decltype。例子:

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

decltype的表达式在编译时计算,因此必须是可解析的。您可以将任何constexpr整数传递给它。

答案 1 :(得分:1)

这取决于你想做什么。在

的身体里面
template <typename T>
void foo(T )
{
  // ...
}

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

答案 2 :(得分: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