确定 std::function 的返回类型

Determining return type of std::function

本文关键字:返回类型 function 确定 std      更新时间:2023-10-16

我正在编写一个接收std::function对象的模板函数(通过使用正确的参数调用std::bind生成)。在此函数中,我想确定此函数对象的返回类型。可能吗?

事实上,我希望模板函数返回相同的类型。你能想到一种优雅的、基于标准的方式来实现这一目标吗?

像这样:

template <typename T>
T::return_type functionObjWrapper(T functionObject) {
   // ...
   return functionObject();
}

谢谢

您可以使用

decltype和尾随返回类型来执行此操作:

template <typename T>
auto functionObjWrapper(T functionObject) -> decltype(functionObject()) {
   // ...
   return functionObject();
}

你正在寻找std::function<F>::result_type

template <typename F>
typename std::function<F>::result_type
functionObjWrapper(std::function<F> functionObject) {
   // ...
   return functionObject();
}

需要std::function<F>::result_type前面的typename,因为这是一个依赖类型名称。

template <class F>
std::result_of_t<F&()> functionObjWrapper(F functionObject) {
  // ...
  return functionObject();
}

std::result_of采用"看起来像函数调用"的类型表达式。 然后,它会告诉您,如果您使用该可调用类型和这些参数进行函数调用会发生什么。

如果您缺少 C++14,请将std::result_of_t<?>替换为 typename std::result_of<?>::type ,或编写自己的:

template<class Sig>
using result_of_t=typename std::result_of<Sig>::type;

在许多 C++11 实现中,result_of 甚至对 SFINAE 友好。

我确实F&()而不是F(),因为我们将使用类型 F 的非常量左值来执行调用。 如果你的最后一行是std::move(functionObject)()std::forward<F>(functionObject)(),你会做result_of_t<F()>