gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:06:11 25 4
gpt4 key购买 nike

考虑以下代码:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com