首页 > 解决方案 > 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 等。

标签: c++haskellfunctional-programmingc++17stdoptional

解决方案


如您所见,这里 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;
}

推荐阅读