std::可选::value_or()-惰性参数求值

std::optional::value_or() - lazy argument evaluation

本文关键字:参数 value 可选 or std      更新时间:2023-10-16

是否可以以惰性方式评估std::optional::value_or(expr)参数,从而仅在没有值的情况下计算expr

如果没有,什么是合适的替代品?

#include <optional>
template <typename F>
struct Lazy
{
F f;  
operator decltype(f())() const
{
return f();
}
};
template <typename F>
Lazy(F f) -> Lazy<F>;
int main()
{
std::optional<int> o;
int i = o.value_or(Lazy{[]{return 0;}});
}

演示

您可以编写辅助函数:

template<typename T, typename F>
T lazy_value_or(const std::optional<T> &opt, F fn) {
if(opt) return opt.value();
return fn();
}

然后可以用作:

T t = lazy_value_or(opt, [] { return expensive_computation();});

如果打字比显式打字要少得多,那就由你来判断了;不过,你可以用一个宏来缩短它:

#define LAZY_VALUE_OR(opt, expr) 
lazy_value_or((opt), [&] { return (expr);})

用作

T t = LAZY_VALUE_OR(opt, expensive_calculation());

这最接近我认为你想要的,但可能会被人反对,因为它隐藏了太多的东西。

使函数类型为可选。

然后可以传入lambda,当调用它时,它将在请求的时刻计算正确的值。

std::optional<std::function<int()>> opt;
int a = 42;
opt = [=] { return a; }
int b = 4;
int c = opt.value_or([=] { return b * 10 + 2;}) ();