从函数模板类型中提取 return 类型

Extracting return type from function template type

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

template<typename Func, typename ... Args>
void func(Func f, Args ... args) {
  ...
  f(args...);
  ...
}

是否可以在编译时从Func类型中提取return类型?

例如,用户有代码并按以下方式调用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 的调用中推断出传递给它的函数 return 是 double?我想将 return 类型信息用于 func.

中的其他内容

以下任何一个都应该有效

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

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

Live demo

如果您可以访问 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;
}

艾德奥内: http://ideone.com/wXnc0g

从 c++17 开始是 std::invoke_result:

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