Всем привет. А особенно тем, кто пишет на плюсах и интересуется грядущими изменениями языка.
Для исследования фич нового стандарта С++ я сделал забавную штуку — функцию для превращения простого функтора в ленивый. Т.е. вычисляемый не более одного раза, и только при первом обращении.
Для использования вам понадобится простой функтор, без аргументов, возвращающий значение.
Применяете к нему calc_once(some_func) — и он становится ленивым.
Под хабракатом код, там и auto, и decltype, и лямбды.
UPD. Спасибо за карму. Перенес в блог С++.
Для исследования фич нового стандарта С++ я сделал забавную штуку — функцию для превращения простого функтора в ленивый. Т.е. вычисляемый не более одного раза, и только при первом обращении.
Для использования вам понадобится простой функтор, без аргументов, возвращающий значение.
Применяете к нему 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.