C++23添加了一些关于选项的“一元式”功能,作为optional<T>
的方法。
optional::and_then()
(忽略this
的限定符):
模板自动and_then(F& f);
返回对包含的值调用f的结果(如果存在)。否则,返回返回类型的空值。
optional::transform()
(忽略this
的限定符):
模板自动变换(F& f);
返回一个std::optional
,如果f
包含一个值,则该结果包含对包含的值调用f
的结果。否则,返回此类类型的空std::optional
。
那么,这两个函数不是在做相同的事情吗?
发布于 2022-11-26 19:32:28
and_then
是一元bind
,flatmap
是>>=
,transform
是函数式map
。
我们可以泛化地用map
来表达bind
,但不能用相反的方式来表达,因为函子不一定是单变量。当然,特定的std::optional
单体可以随时打开,因此这两个函数都可以用普通的预C++23 std::optional
API表示。因此,C++标准为什么定义这两个函数的问题并不比它为什么定义这两个函数的问题更好。也许标准希望独立地给程序员一个标准的函数接口和一个标准的一元接口。任何一个接口本身都是有用和重要的。
发布于 2022-11-27 07:35:06
and_then
只接受T -> std::optional<U>
类型的函数(而transform
可以接受返回任何类型的函数)。
如果您只是使用这样一个函数的transform
,您将得到一个std::optional<std::optional<U>>
。
然后,and_then
将std::optional<std::optional<U>>
压缩成一个std::optional<U>
。
这就是所有的单变量:由类型级别的transform
组成的flatten
。想想range<range<U>>
和future<future<U>>
。
https://stackoverflow.com/questions/74581060
复制相似问题