繁体   English   中英

确定std :: function的返回类型

[英]Determining return type of std::function

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

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

就像是:

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

谢谢

您可以使用decltype和尾随返回类型来执行此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类型的非const左值来进行调用。 如果您的最后一行是std::move(functionObject)()std::forward<F>(functionObject)() ,那么您将执行result_of_t<F()>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM