[英]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.