воскресенье, 15 февраля 2015 г.

[prog.c++11] Лямбды в качестве локальных функций для упрощения кода

Под катом пример маленького и очень тривиального рефакторинга. С использованием приема, который я некоторое время назад подсмотрел в чужом коде и с тех пор с удовольствием применяю в C++11 коде.

Было:

using namespace std;
using namespace std::chrono;

void
show_cfg(
   const cfg_t & cfg )
{
   cout << "Configuration:\n"
      "operation duration: "
         << duration_cast< milliseconds >( cfg.m_op_duration ).count() << " ms.\n"
      "operation timeout:  "
         << duration_cast< milliseconds >( cfg.m_op_timeout ).count() << " ms.\n"
      "check interval:     "
         << duration_cast< milliseconds >( cfg.m_check_interval ).count() << " ms."
      << endl;
}

Стало:

using namespace std;
using namespace std::chrono;

void
show_cfg(
   const cfg_t & cfg )
{
   auto ms = []( steady_clock::duration d ) {
         return duration_cast< milliseconds >( d ).count();
      };
   cout << "Configuration:\n"
      "operation duration: " << ms( cfg.m_op_duration ) << " ms.\n"
      "operation timeout:  " << ms( cfg.m_op_timeout ) << " ms.\n"
      "check interval:     " << ms( cfg.m_check_interval ) << " ms."
      << endl;
}

Причем это как раз тот случай, когда auto и вывод типов в C++11 совершенно в тему. Особенно хорошо то, что C++11 сам может вывести тип возвращаемого лямбдой значения. Поэтому не приходится выяснять, что именно возвращается методом milliseconds::count(). Ну а в C++14 автоматически мог бы выводится и тип аргумента лямбды.

Комментариев нет: