我不确定你做错了什么,这似乎对我有用:
template <class FType>
struct SomeClass
{
using FunctionReturnType =
decltype(std::declval<FType>()(std::declval<int>()));
};
int f(int){return 0;}
SomeClass<decltype(f)>::FunctionReturnType t = 0;
我只记得我有这段代码,我不久前在这个网站的某个地方找到了:
#include <functional>
template<typename T>
struct function_traits_impl;
template<typename R, typename ...Args>
struct function_traits_impl<std::function<R(Args...)> >
{
static const std::size_t nargs = sizeof...(Args);
typedef R result_type;
template <std::size_t i>
struct arg
{
typedef typename std::tuple_element<i, std::tuple<Args...> >::type type;
};
};
template <class R, class T, class ... Args>
function_traits_impl<std::function<R(Args...)> > function_traits(R(T::*)(Args...)const)
{
return function_traits_impl<std::function<R(Args...)> >();
}
template <class R, class T, class ... Args>
function_traits_impl<std::function<R(Args...)> > function_traits(R(T::*)(Args...))
{
return function_traits_impl<std::function<R(Args...)> >();
}
template <class R, class ... Args>
function_traits_impl<std::function<R(Args...)> > function_traits(R(*)(Args...))
{
return function_traits_impl<std::function<R(Args...)> >();
}
您可能会发现它很有用。它的用法如下:
typedef decltype(function_traits(&f)) f_info;
static const unsigned num_args = f_info::nargs;
typedef f_info::arg<0>::type arg_type;
typedef f_info::result_type result_type;
它允许您获取参数的数量、它们的类型和函数的返回类型,而无需先验地了解函数。 function_traits
为成员函数和自由函数重载,因此它可以同时使用。
我不记得我在哪里找到了这个,但它就在附近的某个地方。