从函数模板类型中提取返回类型

时间:2015-01-16 20:36:34

标签: c++ templates c++11

我有一个类似于以下的包装函数:

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内的其他内容。

3 个答案:

答案 0 :(得分:4)

以下任何一项都应该有效

using result_type = decltype(std::declval<Func>()(std::declval<Args>()...));

using result_type = typename std::result_of<Func(Args...)>::type;

Live demo

答案 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...)>;