我有一个类似于以下的包装函数:
template<typename Func, typename ... Args>
void func(Func f, Args ... args) {
...
f(args...);
...
}
是否可以在编译时从类型Func
中提取返回类型?
例如,用户拥有代码并按以下方式调用func
:
template<typename T>
T add(const T& l, const T& r) {
return l + r;
}
int main(int argc, char** argv) {
double a = 4.5, b = 5.5;
func(add<double>, a, b);
return 0;
}
我们可以在func
的调用中推断函数是否传递给它,它返回double
?我想将返回类型信息用于func
内的其他内容。
答案 0 :(得分:4)
以下任何一项都应该有效
using result_type = decltype(std::declval<Func>()(std::declval<Args>()...));
或
using result_type = typename std::result_of<Func(Args...)>::type;
答案 1 :(得分:0)
如果您有权访问C ++ 14,或者只是出于好奇,请尽量不要提交特定类型。 以下代码使用通用lambda,并为您推导出类型。 在许多情况下,我发现它更容易使用。
#include <iostream>
using namespace std;
template<typename Func, typename ... Args>
void func(Func&& f, Args ... args) {
return;
}
auto add = [](auto l, auto r) { return l * r; };
int main()
{
auto a = double{4.5};
auto b = double{5.5};
func(add, a, b);
return 0;
}
Ideone: http://ideone.com/wXnc0g
答案 2 :(得分:0)
从c ++ 17开始,它是std::invoke_result
:
using result_type = typename std::invoke_result_t<Func(Args...)>;