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

112

Статическое метапрограммирование (также известное как «шаблонное метапрограммирование») - это отличный метод 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 ++, каковы лучшие источники (книги, веб-сайты, онлайн-курсы и т. Д.)?

jwfearn
источник
43
лампочка погасла или загорелась?
Horseyguy
36
Выкл. Однозначно выключено.
Томас Эдинг

Ответы:

108

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

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

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

Тодд Veldhuizen имеет отличный учебник здесь .

Хороший ресурс для программирования на 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 ++ Templates: The Complete Guide, так как это также исчерпывающий справочник по шаблонам в целом.

jwfearn
источник
2
Ссылка на статью Тодда Велдхейзена устарела.
Джон Р. Стром
1
ссылка исправлена, спасибо!
jwfearn
Ссылка снова битая!
Пол
1
Спасибо @jwfearn, я прочитал статью, хотя мне она показалась более интересной: youtube.com/watch?v=Am2is2QCvxY (она состоит из двух частей). Это доклад Уолтера Э. Брауна: «Современное метапрограммирование шаблонов: компендиум»
Пол
24

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

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

Аларик
источник
12

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

Флориан Бёш
источник
5
«Какого черта, я могу просто выбрать язык получше и получить его бесплатно» Мммм, что ты имеешь в виду? Меня особенно смущает "бесплатно". А какой еще язык вы имели в виду?
Pop Catalin
12
Метапрограммирование шаблонов C ++ дает вам всевозможные новые возможности, такие как передача типов или списка типов в качестве аргументов и т. Д. Большинство этих возможностей присутствует в динамически типизированных языках, таких как Python, с более приятным синтаксисом.
Флориан Бёш,
1
Если вы ищете язык, на котором можно быстро писать правильные программы, Python лучше, чем C ++. Если вам нужны некоторые другие возможности C ++, добавление Lisp-подобных возможностей в C ++ может быть лучше, чем попытки C ++ - если вы хотите использовать другой язык.
Дэвид Торнли,
6

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

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

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

Nik
источник
5

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

Затмение
источник
5

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

MSalters
источник
4

Оригинальные документы Велдхёйзена были хорошими. Если вам нужна целая книга, то есть книга Вандевурда «Полное руководство по шаблонам C ++». А когда вы будете готовы к магистерской программе, попробуйте «Современный дизайн C ++» Александреску.

Eduffy
источник
4

Google Александреску, Современный дизайн на C ++: применение общих шаблонов программирования и проектирования

Максим Ананьев
источник