考虑以下代码:
#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/