Лучшее введение в метапрограммирование шаблонов C++?

Статическое метапрограммирование (также известное как "метапрограммирование шаблонов") - это отличный метод C++, который позволяет выполнять программы во время компиляции. У меня в голове погасла лампочка, как только я прочитал этот пример канонического метапрограммирования:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}

Если кто-то хочет больше узнать о статическом метапрограммировании на C++, каковы лучшие источники (книги, веб-сайты, онлайн-курсы и т. Д.)?

8 ответов

Решение

[Отвечая на мой собственный вопрос]

Лучшее введение, которое я нашел до сих пор, - это глава 10 "Статическое метапрограммирование в C++" из " Генеративного программирования, методов, инструментов и приложений " Кшиштофа Чарнецкого и Ульриха В. Айзенекера, ISBN-13: 9780201309775; и глава 17 "Метапрограммы" шаблонов C++: полное руководство Дэвида Вандевордера и Николая М. Йосуттиса, ISBN-13: 9780201734843.

альтернативный текстальтернативный текстальтернативный текстальтернативный текст

У Тодда Вельдхуйзена отличный учебник.

Хорошим ресурсом для программирования на C++ в целом является Modern C++ Design от Андрея Александреску, ISBN-13: 9780201704310. Эта книга смешивает немного метапрограммирования с другими методиками шаблонов. В частности, для метапрограммирования см. Разделы 2.1 "Утверждения времени компиляции", 2.4 "Отображение интегральных констант в типы", 2.6 "Выбор типа", 2.7 "Определение конвертируемости и наследования во время компиляции", 2.9 ". NullType а также EmptyType "и 2.10" Типовые черты ".

Лучший промежуточный / продвинутый ресурс, который я нашел, - это метапрограммирование шаблонов C++ Дэвида Абрахамса и Алексея Гуртового, ISBN-13: 9780321227256

Если вы предпочитаете только одну книгу, приобретите Шаблоны C++: Полное руководство, поскольку оно также является основным справочником по шаблонам в целом.

Книга Андрея Александреску " Современный дизайн C++" охватывает многие из этих и других приемов для быстрого и эффективного современного кода C++ и является основой для библиотеки Loki.

Также стоит упомянуть библиотеки Boost, которые интенсивно используют эти методы и, как правило, имеют очень высокое качество обучения (хотя некоторые из них довольно плотные).

Современный C++ Design, блестящая книга и шаблон дизайна, созданный Александреску. Предупреждаю: после прочтения этой книги я перестал заниматься C++ и подумал: "Что за черт, я могу просто выбрать лучший язык и получить его бесплатно".

На ум приходят две хорошие книги:

  • Современный дизайн C++ / Андрей Александреску (ему на самом деле 7 лет, несмотря на название!)
  • Шаблоны C++: Полное руководство / Vandevoorde & Josuttis

Это довольно глубокая область, поэтому такая хорошая книга рекомендуется на веб-сайтах. Некоторые из более продвинутых методов помогут вам изучить код на некоторое время, чтобы понять, как они работают!

Современный C++ - одно из лучших введений, которые я читал. Он охватывает реальные полезные примеры шаблонного метапрограммирования. Также взгляните на сопутствующую библиотеку Loki.

Там не будет большого списка книг, так как список людей с большим опытом ограничен. Метапрограммирование шаблонов началось по-настоящему во время первого семинара по программированию шаблонов C++ в 2000 году, и на нем присутствовали многие из названных авторов. (IIRC, Андрей этого не сделал.) Эти пионеры сильно повлияли на ситуацию, и в основном то, что должно быть написано, теперь написано. Лично я бы посоветовал Vandevoorde & Josuttis. "Александреску" - сложная книга, если вы новичок в этой области.

google alexandrescu, современный дизайн C++: применены общие шаблоны программирования и проектирования

Оригинальные документы Вельдхуйзена были хорошими. Если вам нужна целая книга, то есть книга Вандевурда "Полное руководство по шаблонам C++". И когда вы будете готовы к магистратуре, попробуйте Alexandrescu Modern C++ Design.

Другие вопросы по тегам