首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++23的可选选项::transform和optional::and_then有什么区别?

C++23的可选选项::transform和optional::and_then有什么区别?
EN

Stack Overflow用户
提问于 2022-11-26 09:30:24
回答 2查看 168关注 0票数 5

C++23添加了一些关于选项的“一元式”功能,作为optional<T>的方法。

optional::and_then() (忽略this的限定符):

模板自动and_then(F& f);

返回对包含的值调用f的结果(如果存在)。否则,返回返回类型的空值。

optional::transform() (忽略this的限定符):

模板自动变换(F& f);

返回一个std::optional,如果f包含一个值,则该结果包含对包含的值调用f的结果。否则,返回此类类型的空std::optional

那么,这两个函数不是在做相同的事情吗?

EN

回答 2

Stack Overflow用户

发布于 2022-11-26 19:32:28

and_then是一元bindflatmap>>=transform是函数式map

我们可以泛化地用map来表达bind,但不能用相反的方式来表达,因为函子不一定是单变量。当然,特定的std::optional单体可以随时打开,因此这两个函数都可以用普通的预C++23 std::optional API表示。因此,C++标准为什么定义这两个函数的问题并不比它为什么定义这两个函数的问题更好。也许标准希望独立地给程序员一个标准的函数接口和一个标准的一元接口。任何一个接口本身都是有用和重要的。

票数 1
EN

Stack Overflow用户

发布于 2022-11-27 07:35:06

and_then只接受T -> std::optional<U>类型的函数(而transform可以接受返回任何类型的函数)。

如果您只是使用这样一个函数的transform,您将得到一个std::optional<std::optional<U>>

然后,and_thenstd::optional<std::optional<U>>压缩成一个std::optional<U>

这就是所有的单变量:由类型级别的transform组成的flatten。想想range<range<U>>future<future<U>>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74581060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档