cpprussia C++ Russia 2019 СПб (31.10.2019)

C++ трюки из Такси

img

Нетиповое и эффективное решение типовых задач:

  • Паттерн Pimpl — но без динамических аллокаций;

  • Быстрое логирование пользовательских типов — но, по возможности, без std::ostream и локалей;

  • Конвертация из JSON/XML/YAML/…​ в пользовательские типы — но c ADL и переиспользованием кода (почти что перегрузка функций по возвращаемому значению).

При написании больших фреймворков приходится сталкиваться с типовыми задачами, решения для которых давно известны. Однако эти решения недостаточно эффективны, и можно сделать намного лучше.

О подобных эффективных трюках мы и поговорим!

1) Есть известный паттерн Pimpl:

<code> struct something {

int foo();

private:

struct impl;
std::unique_ptr< const impl> impl_; // динамическая аллокация :(
};
</code>

А давайте уберём из него динамическую аллокацию и добавим кэш-дружелюбность.

2) Логирование пользовательских типов:

<code> std::ostream& operator<<(std::ostream& os, const user_data_type& udt);

my_debug_logger << user_data_type{"foo", "bar"};

</code>

А давайте обойдёмся без std::ostream и без вычисления значения переменных для записей, которые мы не будем логировать.

3) Конвертация из JSON/XML/YAML/…​ в пользовательские типы:

<code>

user_data_type1 Parse(const Json& value);

user_data_type2 Parse(const Json& value);

template < class T> T Parse(const Json& value);

template <> user_data_type1 Parse(const Json& value);

template <> user_data_type2 Parse(const Json& value);

</code>

Давайте сделаем красиво.

Комментарий программного комитета:

Все доклады Антона очень качественные: видно, что он любит своё дело и очень хорошо его знает. Поэтому всегда интересно и полезно послушать практические и жизненные советы от него.