std::可选::value_or()-惰性参数求值
std::optional::value_or() - lazy argument evaluation
是否可以以惰性方式评估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;}) ();
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 无法使用 auto 来参数化true_type来检测 T::value()
- "Any value" 对于 'const std::string&' 参数
- cmake -D <var>:<type>=<value> 参数"-D"是什么意思
- 瓦尔格林德对带有默认参数的变量进行"conditional jump on uninitialized value"
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- SFINAE 尝试使用布尔值给出编译器错误:"模板参数'T::value'涉及模板参数"
- const或ref或const ref或value作为setter函数的参数