Лучшее введение в метапрограммирование шаблонов C ++?[закрыто]
-
02-07-2019 - |
Вопрос
Статическое метапрограммирование (также известное как "шаблонное метапрограммирование") - отличный метод 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 ++, каковы наилучшие источники (книги, веб-сайты, онлайн-курсы, что угодно)?
Решение
[Отвечая на мой собственный вопрос]
Лучшее введение, которое я нашел на данный момент, - это глава 10 "Статическое метапрограммирование в C ++" из Генеративное программирование, Методы, инструменты и приложения by Krzysztof Czarnecki and Ulrich W.Айзенекер, ISBN-13:9780201309775;и глава 17, "Метапрограммы" Шаблоны C ++:Полное Руководство Дэвид Вандевордер и Николай М.Джосуттис, ISBN-13:9780201734843.
У Тодда Вельдхейзена есть отличный учебник здесь.
Хорошим ресурсом для программирования на C ++ в целом является Современный дизайн на C ++ автор: Андрей Александреску, ISBN-13:9780201704310.В этой книге немного смешано метапрограммирование с другими техниками создания шаблонов.В частности, о метапрограммировании см. Разделы 2.1 "Утверждения во время компиляции", 2.4 "Сопоставление целых констант типам", 2.6 "Выбор типа", 2.7 "Определение конвертируемости и наследования во время компиляции", 2.9 "NullType
и EmptyType
" и 2.10 "Типовые черты".
Лучший промежуточный / продвинутый ресурс, который я нашел, - это Метапрограммирование шаблонов C ++ Дэвид Абрахамс и Алексей Гуртовой, ISBN-13:9780321227256
Если вы предпочитаете только одну книгу, получите Шаблоны C ++:Полное Руководство поскольку это также окончательная ссылка для шаблонов в целом.
Другие советы
Имя Андрея Александреску Современный дизайн на C ++ книга охватывает множество этих и других приемов для быстрого и эффективного современного кода на C ++ и является основой для Локи библиотека.
Также стоит упомянуть о Повышение библиотеки, которые в значительной степени используют эти методы и обычно очень высокого качества для изучения (хотя некоторые из них довольно плотные).
Современный дизайн на C ++, блестящая книга Александреску "основы дизайна".Предупреждаю, после прочтения этой книги я перестал заниматься C ++ и подумал: "Какого черта, я могу просто выбрать язык получше и получить его бесплатно".
На ум приходят две хорошие книги::
- Современный дизайн на C ++ / Андрей Александреску (На самом деле ему 7 лет, несмотря на название!)
- Шаблоны C ++:Полное руководство / Vandevoorde & Josuttis
Это довольно подробная область, поэтому хорошую книгу, подобную одной из этих, определенно рекомендуется размещать на веб-сайтах.Некоторые из более продвинутых методов заставят вас некоторое время изучать код, чтобы понять, как они работают!
Современный C ++ это одно из лучших введений, которые я когда-либо читал.В нем рассматриваются реальные полезные примеры метапрограммирования шаблонов.Также загляните в сопутствующую библиотеку Локи.
Большого списка книг не будет, так как список людей с большим опытом ограничен.Метапрограммирование шаблонов началось по-настоящему на первом семинаре по программированию шаблонов на C ++ в 2000 году, и многие из названных авторов приняли в нем участие.(IIRC, Андрей этого не делал.) Эти пионеры сильно повлияли на эту область, и в основном то, что должно было быть написано, сейчас написано.Лично я бы посоветовал Vandevoorde & Josuttis.Книга Александреску - сложная книга, если вы новичок в этой области.
Оригинальные статьи Велдхейзена были хороши.Если вам нужна целая книга, то есть книга Вандевурда "Полное руководство по шаблонам C ++".А когда вы будете готовы к магистерскому курсу, попробуйте современный дизайн Александреску на C ++.
google Александреску, Современный дизайн на C ++:Применяемые общие шаблоны программирования и проектирования