c++ - 有没有一种紧凑的方法可以使 std::optional<T>::value_or 处理 T 的成员变量

标签 c++ c++20 stdoptional

考虑以下代码:

#include <iostream>
#include <optional>
struct S{
    int b;
    int e;
};

void fn(const std::optional<S>& maybe_s){
    int begin = maybe_s? maybe_s-> b: 0;
    int end = maybe_s? maybe_s->e : 100;
    std::cout << begin << "    " << end << std::endl;
}

int main() {
    std::optional<S> empty_opt;
    fn(empty_opt);
    std::optional<S> active_opt{S{11, 47}};
    fn(active_opt);
}

这里我想要类似 value_or 的东西,但不是针对 S,而是针对它的成员。 有没有办法在 C++ 中很好地做到这一点?

请注意,我希望它在类初始化列表中工作,所以我不能使用结构化绑定(bind)。

我有这个解决方案,但如果可能的话,我更喜欢使用 std:: 中的内容(便于新开发人员阅读,而且我的解决方案可能存在性能问题 + 没有适当的约束,例如 V必须可转换为调用结果...)。

template<typename T, typename M, typename V>
decltype(auto) memb_or(const std::optional<T>& opt, M m, const V& default_val){
    if (opt){
        return std::invoke(m, *opt);
    } else {
        return default_val;
    }
}

最佳答案

虽然还没有在标准中,P0798R6 (std::optional 的 Monadic 操作)可能会为您正在寻找的东西提供一些糖分,这在 Sy Brand's std::optional implementation 中实现。 .

看起来提案只是 recently approved for C++23 :

JeffGarland commented on Jul 10

LWG completed review 2021-07-09

poll: Adopt D0798R8 Monadic operations for std::optional for C++23?

F  A  N
7  0  0

关于c++ - 有没有一种紧凑的方法可以使 std::optional<T>::value_or 处理 T 的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69375675/

相关文章:

c++ - 将延迟加载编写为模板类是否合理?

c++ - 动态可转换类型特征

c++ - 一起使用 cppcoro 和 ASIO 的 co_spawn

c++ - 对于使用C++ 20破坏运算符delete的非多态派生类,则为unique_ptr

c++ - 使用 std::optional 来避免函数中的默认参数有什么好处吗?

c++ - C++ 标准是否允许在没有开销的情况下实现 std::optional<double>

c++ - std::optional 成员是否连续存储?

c++ - 识别 C++ 必要包含的快速方法

c++ - cv::erode 导致错误:OpenCV 错误:Mat 中的断言失败(m.dims >= 2)

c++ - generic int -> enum conversion with templates 可能吗?