суббота, 1 апреля 2017 г.
[life.cinema] Очередной кинообзор (2017/03)
пятница, 31 марта 2017 г.
[prog.thoughts] Блеск и нищета C++
C++ -- это, блин, язык контрастов. В один день доводится увидеть совершенно крышесносящие примеры сочетания техники CRTP и variadic templates и наглядную демонстрацию того, как на C++ программируют в реальном мире.
Серьезно, если кто-то еще не читал эту небольшую PDF-у, в которой показываются трюки вроде:
template <typename N, template <typename...> class... CRTPs> class Number : public CRTPs<Number<N, CRTPs...>>... { public: using S = decay_t<underlying_arithmetic_type_t<N>>; constexpr Number() // note: intentionally uninitialized {} constexpr Number(S value) : value_(value) {} constexpr S value() const { return value_; } constexpr void set_value(S a) { value_ = a; } private: N value_; }; template <typename T> class Stream_i { friend std::ostream &operator <<(std::ostream &a, T b) { return a << b.value(); } }; template <typename T> class Shift_i { friend T operator <<(T a, T b) { return T(a.value() << b.value()); } friend T operator >>(T a, T b) { return T(a.value() >> b.value()); } }; template <typename T> class Eq_i { friend constexpr bool operator ==(T a, T b) { return a.value() == b.value(); } friend constexpr bool operator !=(T a, T b) { return a.value() != b.value(); } }; ... using restricted_int = Number<int, Eq_i, Rel_i, Add_i, Stream_i>; // Supports only ==, !=, <, >, <=, >=, +, +=, <<(ostream). |
то очень рекомендую. От нового взгляда на возможности современного C++ глаза распахиваются еще шире :)
Это, конечно же, с непривычки сносит крышу. Но, блин, ведь круто же. Очень интересный способ композиции возможностей на основе CRTP.
И на этом фоне реальный топик с LOR-а, в котором человек приводит свой код и просит подсказать, в чем проблема.
Код -- полный ахтунг. Если кому-то не жаль 15 минут времени, советую сходить на LOR, посмотреть полный текст. Под катом я попробую разобрать только его фрагмент.
вторник, 28 марта 2017 г.
[prog.c++] Библиотека timertt обновилась до версии 1.1.3
Вышла обновленная версия библиотеки timertt для работы с таймерами в C++ -- 1.1.3. В этой версии в публичный интерфейс timer_manager и timer_thread добавлена функция empty(), которая проверяет, пуст ли список таймеров или нет.
Признаюсь, это глупый косяк, который был допущен пару лет назад. В потрохах библиотеки empty() был реализован для всех timer_engine, но вот наружу я его тупо забыл вытащить (объект timer_engine инкапсулирован внутри timer_manager/timer_thread и просто так его методы недоступны).
Библиотека разрабатывалась для замены ACE в проекте SObjectizer, поэтому все, что связано с timertt, находится на SourceForge:
- архивы с исходными текстами доступны в секции Files. Архив timertt-1.1.3-headeronly.7z содержит только основной заголовочный файл со всей функциональностью timertt. Архив timertt-1.1.3-full.7z содержит так же тесты, примеры и сгенерированный посредством Doxygen API Reference Manual;
- основная документация для проекта собрана в Wiki;
- исходники лежат в Subversion-репозитории на SourceForge. Релизные версии в tags/timertt, находящиеся в разработке версии в branches/timertt.
понедельник, 27 марта 2017 г.
[prog.flame] Rust-оманы зря пытаются продавать Rust С++никам, им бы поменять целевую аудиторию :)
Данный пост возник под впечатлением от двух недавних больших срачей на reddit-е на тему о том, почему Rust лучше C++: Have you used Rust? Do you prefer it over Modern C++? и Things I love about Rust while being a C++ programmer. А так же интересным ссылкам, которые проскочили в этих обсуждениях, например: вот (про некоторые проблемы Rust) или вот (специально для тех, кто верит, что безопасность Rust-а не имеет платы в run-time). Кроме шуток, срачи интересные, помимо обычного булшита (например, в очередной раз всплыл аргумент о том, как классно иметь возможность во время компиляции подключиться к СУБД, выкачать оттуда описание схемы данных и сгенерировать ORM) встречаются и прикольные примеры C++ граблей на ровном месте. Вот, скажем: