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

RU

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

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

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

struct something { int foo(); private: struct impl; std::uniqueptr 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 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).

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


Наши контакты