gpt4 book ai didi

c++ - 推断仿函数返回类型的通用方法?

转载 作者:IT老高 更新时间:2023-10-28 21:38:08 24 4
gpt4 key购买 nike

这个问题是 How to deduce the type of the functor's return value? 的后续问题。我正在以更抽象的方式重新制定它。

给定一个模板函数的伪代码

template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}

在哪里 <ret-expr>是涉及 arg 的任意表达式, 我应该用什么 <decl-expr>设置 ComputeSomething 的返回类型等于仿函数的返回类型。

仿函数可以是类、lambda 或函数指针。

目前我找到的部分解决方案。

(a) 我的链接问题的答案由 ecatmur 完成。本质上,它是在重复 <decl-expr> 中的 return 语句。 .问题:容易出错,如果包含局部变量则无法工作。

(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正如 how to deduce the return type of a function in template 中所建议的那样,这应该解除默认可构造的限制。 .谁能解释一下它是如何工作的?

template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())

最佳答案

使用 result_of .它是向后兼容的,可以消除代码中所有丑陋的 declval 痛苦。如果您实际上只是转发值,您仍然需要记住添加右值引用限定符 (&&)。

我认为重要的其他事情:您的函数将参数转发给另一个函数。在这种情况下,您应该始终使用右值引用来传递参数。

如果您想要做的只是提高可维护性:围绕 RETURNS 宏进行了多次尝试,以尽量减少返回类型声明和实际返回表达式之间的重复,但我没有'没有看到任何允许函数体包含比实际返回语句更多的函数。

至于 declval 是如何工作的:它依赖于编译器。它不允许出现在评估的内容中,并且它的参数可以是不完整的类型。见 20.2.4

关于c++ - 推断仿函数返回类型的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12033620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com