我们的想法是将foo(...)作为函数参数,并且可以选择调用foo(...)。 我可以这样做:
template <typename T, typename FUNCTION, typename... ARGS>
T value_or(const optional<T>& value, const FUNCTION& fp, const ARGS&... args)
{
if (value)
return *value;
else
return fp(args...);
}
例如,我可以这样做:
int foo0() { return 10; }
int foo1(int x) { return x; }
int foo2(int x, double ) { return x; }
optional<int> x;
value_or(x, foo0);
value_or(x, foo1, 34);
value_or(x, foo2, 34, 5.0);
但我也希望使用这种表示法:
value_or(x, foo0());
value_or(x, foo1(34));
value_or(x, foo2(34, 5.0));
有没有办法实现这个目标?
注意:我所描述的函数value_or的兴趣在于,如果std :: optional有效,函数foo 永远不会被调用。 这意味着,避免了潜在的昂贵呼叫。 使用经典函数std :: optional :: value_or(foo()),无论std :: optional的状态如何,都会调用foo()。