Pull to refresh

Ленивые вычисления в с++0x, тест новых фич

Reading time1 min
Views5K
Всем привет. А особенно тем, кто пишет на плюсах и интересуется грядущими изменениями языка.
Для исследования фич нового стандарта С++ я сделал забавную штуку — функцию для превращения простого функтора в ленивый. Т.е. вычисляемый не более одного раза, и только при первом обращении.
Для использования вам понадобится простой функтор, без аргументов, возвращающий значение.
Применяете к нему calc_once(some_func) — и он становится ленивым.

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.


Под хабракатом код, там и auto, и decltype, и лямбды.

UPD. Спасибо за карму. Перенес в блог С++.


#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.
Tags:
Hubs:
Total votes 39: ↑34 and ↓5+29
Comments29

Articles