我正在编写一个接收std::function
对象的模板函数(通过使用正确的参数调用std::bind
生成)。
在这个函数中,我想确定这个函数对象的返回类型。有可能吗?
事实上,我希望模板函数返回相同的类型。您能想到一种优雅,标准的实现这一目标的方式吗?
类似的东西:
template <typename T>
T::return_type functionObjWrapper(T functionObject) {
// ...
return functionObject();
}
由于
答案 0 :(得分:9)
您可以使用decltype
和尾随返回类型:
template <typename T>
auto functionObjWrapper(T functionObject) -> decltype(functionObject()) {
// ...
return functionObject();
}
答案 1 :(得分:2)
您正在寻找/*]]>*/
即
<script th:inline="javascript">
/*<![CDATA[*/
$(function () {
$("#datepicker").datepicker();
});
/*]]>*/
</script>
需要std::function<F>::result_type
之前template <typename F>
typename std::function<F>::result_type
functionObjWrapper(std::function<F> functionObject) {
// ...
return functionObject();
}
,因为这是一个依赖类型名称。
答案 2 :(得分:0)
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()>
。