std::optionals 上的数学?

Math on 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<[...]>

添加与 size_t 类型相同的 optional 类型似乎很自然。 ~~我知道 Haskell 本身就支持这个~~(编辑:这个假设并不完全正确)。 当然我可以写一个辅助函数。我问的目的是确保没有更简单的方法来做到这一点。 在你提出建议之前,是的,我已经用谷歌搜索、RTFM 搜索等

如您所见,here std::optional 根本不提供 operator+ 会员。毕竟,std::optional 能够包含任何内容,包括 operator+ 没有意义的类型。 optional<that_type>::operator+ 会为这些类型做什么?

显然,您可以编写自己的自由函数(取模 const/&/两者或您认为适合 parameters/return 类型的任何函数):

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;
}