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

RU / День 1 / 18:30 / Зал 1

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

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

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

struct something {

int foo();

private:

struct impl;

std::uniqueptr< const impl> impl; // динамическая аллокация :(

};

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

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

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

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

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

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

// Так не компилируется:

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);

// ...ужасные нечитаемые сообщения об ошибках, и чудит Parse>(const Json& value).

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