суббота, 28 августа 2010 г.

Beyond the C++ Standart Library

Почитав в очередной раз своего любимого Алекса Отта очень захотелось изучить две книги по С++, которые он рекомендует. Так как наверное всю хорошую литературу по С++ я уже успел почитать, то книги на английском по такой фундаментальной штуке как boost не могут не интересовать. Порывшись немного в интернете так и не смог найти русские варианты этих книг. зато нашел на озоне их английские оригиналы - каждый за вполне кругленькую сумму. Хм, подумалось мне, неужели меня задушит жаба и я их не прочитаю.. Но тут вспомнилось, что в нашей замечательной фирме есть библиотека! И даже эту библиотеку можно пополнять! Написав письмо с аргументами в пользу приобретения данных творений я, к моему большому восторгу, получил одобрение на их покупку. Ждать этих книг от озона пришлось с месяц, но это время было потрачено с толком: в изучении фундаментального труда Меера (и даже оболочки по Eiffel) - об этом я напишу позднее.

Итак наконец книги пришли, и я принялся за изучение первой из них: Beyond the C++ Standart Library An Introduction to Boost. Первое впечатление: простовато, и почти все мне известно. Обзор библиотек boost не добавил ничего нового - это все можно получить из электронной документации. Ладно, почитаем про те 12 библиотек, которые описаны подробно (smart pointers, conversion, utility, operators, regex, any, variant, tuple, bind, lambda, function, signals).

Со всеми этими библиотеками я был знаком и использовал в своих проектах с разной степенью интенсивность (разве что кроме signals). Так что общий смысл и описания в каждой главе не представляли большого откровения. НО вот некоторые малозначительные детали, о которых никогда не задумываешься, если не припрет жизнь, не давали заскучать и извлечение крупиц этих новых знаний стало для меня настоящим приключением при перелистывании этой книги. Вот примерный список того, что нового я извлек для себя:

  1. Использование shared_ptr для блокировки создания объектов,не хоронящихся в самом shared_ptr - получается очень элегантно - и клиенты класса уже не могут создавать объекты на стеке, по недоразумению, например.
  2. Использование shared_ptr вместе с fclose в качестве деструктора - вот это красиво!
  3. Использование polymorphic_cast - все-таки не хочется проверять на 0 результат dynamic_cast
  4. polymorphic_downcast - оптимизация.. вот это кажется сомнительным
  5. оказывается к unsigned типу можно присвоить любой numeric тип. и не знал, что они являются особым случаем
  6. никогда не встречался и не задумывался над проблемой, которую решает checked_delete - век живи - век учись!
  7. Шаманство с перегрузкой/специализацией функций (классов) и борьба с проблемами с помощью enable_if. Наверное я слишком мало занимался шаблонным програмированием... Ну ничего! Все впереди!
  8. Оказывается отправление названия наследуемого класса в шаблон базового - это есть трюк Бартона-Некмана (Barton-Nackman). Во как.
  9. Разница между Equality и Equivalence. Вроде знаешь, а освежить никогда не лишне.
  10. использование sregex_iterator/sregex_token_iterator для работы с набором значений в строке - это кажется довольно удобным - обязательно надо будет попробовать на практике.
  11. Вывод значений из any с помощью кастомного класса any_out - очень красивый пример связи полиморфизма и шаблонных классов.
  12. Вообще к tuple у меня было несколько предвзятое отношение, так как в одном из наших проектов он использовался в одном месте кривым образом и постоянные обращения через get<3> и т.п. вызывали настоящий ужас. но тут почитав про них я узнал много нового, что даже заставило, в некотором роде, зауважать эту библиотеку: оказывается у них имеется развитая поддержка вывода в поток, большие возможности метапрограммирования и даже аналоги cdr и car из lisp. в общем с этой библиотекой можно неплохо поразвлечься при желании - так что надо найти время и переписать тот ужасный кусок в нашем проекте.
  13. Оказывается в bind можно привязываться к переменным класса. хм - и даже у меня в проекте я наткнулся на такой код. в каком же состоянии я его писал?!
  14. Вложенные bind - тут автор явно перебрал. Код ооочень быстро становится не читаемым. Только не так! Для production такие вещи не нужны.
  15. Использование labmda у меня ограничивалось только небольшими кусками. Те монстры, которые приведены в книге не внушают доверия - кажется часто проще написать функтор. Да к тому же в недрах spirit зародилась библиотека которая вроде как сделала lambda устаревшей. Но все таки окунуться в этот оазис функционального программирования в С++ очень приятно (иногда).
  16. использование function вместе с указателями на функции класса - это для меня что-то новенькое. хотя не думаю, что это используется хоть сколь-нибудь часто.
  17. описание примерной реализации function было довольно интересно

У книжки конечно есть недостатки: зачастую слишком тривиальным вещам уделяется много внимания, примеры часто довольно примитивны, не затрагиваются многие проблемы библиотек - например нет ничего про проблемы в variant при возникновении исключений во время присвоения или про signals в многопоточной среде (signals2 ау!). И конечно описывается уже несколько устаревшая версия, хотя это почти не коснулось описываемых библиотек. Но в итоге книга произвела на меня положительное впечатление: по телу раливается приятное тепло когда вычитываешь из книги что-тоновое и интересное.