c++ - std::optionals 上的数学?
问题描述
当我尝试这个时:
#include <optional> using namespace std;
int main() {
return make_optional(2) + make_optional(3);
}
我明白了:
error: no match for ‘operator+’ (operand types are ‘std::optional<int>’ and
‘std::optional<int>’)
5 | return make_optional(2) + make_optional(3);
| ~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~
| | |
| optional<[...]> optional<[...]>
optional
添加与类型相同的类型似乎很自然size_t
。~~我知道 Haskell 本身就支持这个~~(编辑:这个假设并不完全正确)。当然我可以写一个辅助函数。我问的目的是确保没有更简单的方法可以做到这一点。在你提出建议之前,是的,我已经用谷歌搜索、RTFM 等。
解决方案
如您所见,这里 std::optional
根本不提供operator+
会员。毕竟,std::optional
它能够包含任何东西,包括operator+
没有意义的类型。这些类型会optional<that_type>::operator+
做什么?
显然,您可以编写自己的自由函数(模const
//&
两者或您认为适合参数/返回类型的任何内容):
std::optional<int> operator+(std::optional<int> o1, std::optional<int> o2) {
if (o1) {
if (o2) {
return std::make_optional(o1.value() + o2.value());
}
}
return std::nullopt;
}
推荐阅读
- button - 在 Jupyter 中使用按钮计算输出
- javascript - 与对象中的值匹配时的 QuerySelector Id 目标
- react-native - 无法对未安装的组件执行 React 状态更新。(react-native-error)
- python - 如何使用 lambda 函数将当前列表索引与下一个列表索引进行比较
- sql - 左表中空记录的子查询问题
- android - 工具栏中的菜单更改或消失
- authentication - 在 Linux 下使用 curl 到 FTPS 到 z/OS FTP TLS 服务器与客户端身份验证
- javascript - render() 是如何实际执行的?
- blazor - Mapster 和 Blazor
- build - Bamboo 构建后自动删除工件的脚本