auto my_func = calc_once([]{ return SomeHugeCalculation(); });
if ((my_func() && some_case) || (!my_func() && some_other_case))
{
}
* This source code was highlighted with Source Code Highlighter .
#include <boost/optional.hpp>
// - ( )
//: auto my_func = calc_once([]{ return SomeHugeCalculation(); });
template<typename LambdaFunc, typename result_type>
class calc_once_func
{
public :
calc_once_func(LambdaFunc func) : func_(func) {}
result_type operator ()()
{
return val_.is_initialized() ? val_. get () : (val_ = func_()). get ();
};
private :
boost::optional<result_type> val_;
LambdaFunc func_;
};
template<typename LambdaFunc>
auto calc_once(LambdaFunc func) -> calc_once_func<LambdaFunc, decltype(func())>
{
return calc_once_func<LambdaFunc, decltype(func())>(func);
}
* This source code was highlighted with Source Code Highlighter .
Source: https://habr.com/ru/post/85718/
All Articles