Обзор книги C++ Templates: The Complete Guide

C++ Templates Книга выпущена под занавес 2017 года и рекламировалась самим Гербом Саттером на конференеции CppCon 2017. Написана она Николоаем Джосаттисом (Nocolai M. Josuttis) в соавторстве с Дэвидом Вандевоордом (David Vandevoorde) и Дугласом Грегором (Douglas Gregor). Это уже второе издание книги, а первое было выпущено в далёком 2002 году.

Кто смотрел выступления Николая знают, что его фамилия произносится как Йосуттис, а не Джосаттис. Но я буду придерживаться второго варианта просто потому, что именно в такой транскрипции он был именован в книгах на русском языке.

У меня было первое издание на русском языке, но я так его и не прочёл. Пару раз использовал как справочник, только и всего. А всё дело в том, что она показалось мне именно справочником, который читать от корки до корки, всё равно, что читать словарь. Был я прав или нет, для меня до сих остаётся загадкой. Тем не менее, когда я узнал о том, что выходит второе издание (спасибо читателям моего блога, именно благодаря вам я об этом узнал), у меня не было сомнений, что книгу нужно брать.

Почему? Сложно сказать, может быть по той же причине, по которой я в своё время купил первое. Причиной этой было впечатление от первого издания «The C++ Standard Library», ну а для этой книги, соответственно,— второго. Уж слишком мне нравится вышеупомянутая книга. Таким образом, я заказал её практически сразу, как она вышла.

Вычеркнув из памяти все предубеждения, что я приобрёл к первому изданию, второе издание я решил читать от корки до корки. И ни разу я об этом не пожалел. Не буду тянуть резину, пытаясь нагнать какой-то загадочности, а скажу сразу — это одна из лучших книг по C++, которые я когда либо читал. Конечно, она ограничена шаблонами, но раскрывает их так, как никто другой этого не делает. Помогают в раскрытии тем и экскурсы в историю, которые приведены в каждой главе. В них описываются причины тех или иных решений, и почему это сделано так, а не вот так. Разумеется, это избранные истории, а не истории всех решений (думаю, что для этого понадобилась бы отдельная книга), но и то, что есть читать очень увлекательно.

В целом книга построена для линейного чтения, начиная с основ и с каждой главой раскрывая ту или иную тему более подробно. В этой книге есть, наверное, все популярные техники, которые известны C++-программистам. Здесь вы встретите CRTP, шаблоны выражений (expression templates), сокрытие типа (type erasure) и разные другие техники. Познакомитесь с двухфазным поиском имён (two-phase name lookup), с которым до сих пор полноценно не дружит компилятор от Microsoft, со SFINAE, которое тот же компилятор до сих пор полноценно не поддерживает (есть всё-таки в мире что-то неизменное). Раз уж речь зайдёт о SFINAE, то и метапрограммироавние стороной не обойдут. Хотя это должно быть очевидно, но я всё же упомяну: в книге вы также найдёте исчерпывающую информацию о том, как выводятся аргументы ��аблонов и даже то, где именно в (в коде) происходит инстанциирование конкретного класса (или же функции).

Кроме техник и теории, книга предлагает нам и конкретные примеры, где ранее полученные знания можно применить. Так, нас научат тому, как написать свой кортеж (tuple), дискриминированное объединение (variant), обобщённую обёртку для функций (function) и прочее. Т.к. книга очень свежая, в ней вы также найдёте информацию и по последнему стандарту (C++17): свёртка, if constexpr, инструкции выведении типа и прочее.

Будучи отличным учебником, книга не теряет себя и в качестве справочника. Я замечал за собой неоднократное консультирование с книгой по разным вопросам, уже после прочтения. Это действительно великолепный учебник и настольная книга. Поэтому я считаю, что любой уважающий себя C++-программист просто обязан с ней ознакомится. Полагаю, что она не будет лёгким чтивом для новичков в языке, но даже им я советую её прочитать. Разумеется, не первой книгой. Но после ознакомления с основами C++, она может стать хорошим продолжением. Как и другая книга Джосаттиса: «The C++ Standard Library». Вообще, имя Николая Джосаттиса для меня стало синонимом качества, и я с нетерпением жду его следующей книги, которую он сейчас пишет.