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