这个问题是如何推断函子返回值的类型的后续问题? 我正在以更抽象的方式重新制定它。
给定模板函数的伪代码
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}
where<ret-expr>
是一个包含 的任意表达式arg
,我应该用什么<decl-expr>
来设置返回类型ComputeSomething
等于函子的返回类型。
仿函数可以是类、lambda 或函数指针。
到目前为止我找到的部分解决方案。
(a) ecatmur 完成的我的链接问题的答案。本质上,它是在重复 return 语句<decl-expr>
。问题:它很容易出错,如果包含局部变量则不起作用。
(b) 它仅适用于函数指针
template <typename Arg, typename Ret>
Ret ComputeSomething(Arg arg, Ret(*fn)(Arg))
(c) 它假设函子的参数是类型的Arg
(一般情况下可能不成立)并且要求Arg
是可默认构造的
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(Arg())
(d) 使用std::declval
which 应该解除默认可构造的限制,如如何在 template 中推断函数的返回类型中所建议的那样。有人可以解释它是如何工作的吗?
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())