Введение....5
Что находится в этом документе....5
Соглашения....5
Как получить этот документ....7
Благодарности....7
Основы....8
Почему Шаблоны?....8
Что такое Шаблон?....10
Объявления Шаблонов....11
Создание экземпляра Шаблона....14
Синтаксис....14
Шаблоны как Аргументы шаблона....15
Выбор среди объявлений....15
Результат создания экземпляра....15
Строительные блоки Шаблона....17
Одноимённый (Eponymous) Трюк....17
Внутренний псевдоним....18
static if....19
Специализации Шаблонов....24
Значения по-умолчанию....26
Шаблоны функций....27
Синтаксис....27
auto return....28
IFTI....28
Пример: Сглаженные массивы и диапазоны....29
Шаблоны анонимных функций....30
Замыкания — Объекты для бедных....31
Function Overloading....32
Классы памяти....32
Свойства выводятся автоматически....33
Предусловия in и out....34
Изменение функций....34
Шаблоны структур....36
Синтаксис....36
Фабричные функции....37
Даём доступ ко внутренним параметрам....37
Шаблонизированные методы....38
Шаблоны конструкторов....42
Внутренние структуры....43
Шаблон параметров This....44
Пример: a Concat / Flatten Range....45
Шаблоны классов....48
Синтаксис....48
Шаблоны методов....49
Условие invariant....49
Внутренние классы....50
Анонимные классы....50
Параметризованные базовые классы....50
Добавление функциональности через наследование....51
Странно рекурсивный шаблон....53
Пример: Автоматическая динамическая диспетчеризация....53
Другие шаблоны?....56
Шаблоны интерфейсов....56
Шаблоны объединений....56
Шаблоны Перечислений?....56
Некоторые более сложные вопросы....58
Ограничения....58
Синтаксис....58
Использование ограничений....59
Пределы ограничений....60
Ограничения, Специализации и static if....61
Шаблоны-предикаты....62
Проверка для члена....62
Проверка для операций....62
Завершение выравнивания диапазонов (Flatten)....63
Кортеж параметров Шаблона....64
Определение и Основные Свойства....64
Tuple, tuple, T... и .tupleof....66
Тип кортежей....67
Перегрузка операторов....73
Синтаксис....73
Шаблоны Mixin....75
Синтаксис....75
Примешивание кода....76
Пример Mixin: Подписчик и Стек....77
opDispatch....81
Синтаксис....81
Getters и Setters....82
Обёртки и Подтипы: Расширение Типов....83
Обёртывающие Шаблоны....83
alias this: Прозрачные типы....83
Библиотека Typedef....86
Типы как информация....88
Литералы, задаваемые пользователем....88
Кодирование информации с типами....88
Шаблоны на шаблонах....90
Шаблоны на пути вниз....90
Двухступенчатые шаблоны функций....91
Кортежи с именованными полями....92
__FILE__ и __LINE__....94
Вокруг Шаблонов: Другие инструменты времени компиляции....97
Строки Mixin....97
Синтаксис....97
Примешивание кода, с использованием шаблонов....97
Пределы....100
Вычисление функции времени компиляции....100
Вычисление во время компиляции....100
__ctfe....100
Шаблоны и CTFE....101
Шаблоны с CTFE и Строками Mixin, ох!....101
Простое заполнение строк....102
Пример: расширение std.functional.binaryFun....103
Сортирующие сети....104
__traits (Признаки)....108
Да/Нет вопросы с __traits....108
identifier....109
getMember....110
allMembers....110
derivedMembers....113
getOverloads....113
Получение всех членов, даже перегруженных....114
Тестирование Реализации интерфейса....117
getVirtualFunctions....118
parent (родитель)....118
Локальная область видимости имени....119
Примеры....122
Превращения типов....122
Отображение, фильтрация и свёртка Типов....122
Сканирование типов, Чередование типов....131
Комментирование типов....132
Кортежи как последовательности....134
Отображение на кортежах....134
Фильтрация кортежей....135
Веселье с функциями....136
Определение количества аргументов функции....136
Мемоизация функции....137
Каррирование функции....141
Соседские функции....142
Реляционная алгебра....144
Порождение событий....147
Поля....151
Расширение enum....151
Статический switch....152
Общие структуры....153
Поглощение....153
Полиморфные ассоциативные списки....154
Полиморфное дерево....155
Шаблоны выражений....156
Статически-проверенный Writeln....157
Расширение класса....162
Приложения....163
Выражение is....163
Общий синтаксис....163
is(Type)....163
is(Type : AnotherType) и is(Type == AnotherType)....164
Специализации типов....167
Ресурсы и дополнительная литература....168
Шаблоны D....168
Метапрограммирование D....170
Шаблоны являются центральной особенностью D, дающей вам мощные возможности генерации кода времени компиляции, которые сделают ваш код более чистым, более гибким, и даже более эффективным. Они везде используются в Phobos — стандартной библиотеке D — и, следовательно, любой пользователь D должен о них знать. Но, основанные на шаблонах C++, как и они, шаблоны D поначалу могут немного пугать.
Документация веб-сайта D Programming Language является хорошим началом, хотя её описание шаблонов разбросано среди многих различных файлов, и (так как это справочник по языку) её материал не столько учит вас использованию шаблонов, сколько показывает вам их синтаксис и семантику. Этот документ стремится быть своего рода учебником по шаблонам D, чтобы показать начинающему D-программисту, чего можно достичь с их помощью. Когда я использовал C++, я не помню, чтобы когда-нибудь использовал шаблоны, кроме как в контейнерах, и считал, что я никогда не смогу понять код метапрограмм уровня Boost1, не говоря уже о его создании. Ну, нормальный синтаксис D для шаблонов и замечательные возможности, такие как, например, static if, alias или кортежи, вылечили меня от этого впечатления. Я надеюсь, что этот документ поможет вам тоже.