Якщо Ви коли-небудь зв’яжетеся з шаблонним метапрограмуванням у мові C++, ви дізнаєтесь, які інструменти пропонує мова D, щоб зробити ваше життя простішим. Шаблонне метапрограмування це техніка, яка уможливлює процес прийняття рішень у залежності від типу властивостей шаблону і, таким чином, дозволяє зробити загальні типи ще більш гнучкішими, основуючись на типі за допомогою якого вони створені.
static if
& is
Як і звичайний if
, static if
умовно компілює кодовий блок,
основуючись на умові, що він може бути оцінений під час компіляції.
static if(is(T == int))
writeln("T є int");
static if (is(typeof(x) : int))
writeln("Змінна x неявно конвертується у int");
Вираз is
є загальним
помічником, який оцінює вирази під час компіляції.
static if(is(T == int)) { // T є параметром шаблону
int x = 10;
}
Дужки опускаються, якщо умова є true
- нова область не створюється.
{ {
та } }
явно створює новий блок.
static if
може бути використаний будь-де у коді: у функціях, у
глобальній області видимості чи у межах визначень типів.
mixin template
Скрізь де ми зустрічаємо шаблонний код, mixin template
є вашим
товаришем:
mixin template Foo(T) {
T foo;
}
...
mixin Foo!int; // int foo доступні тут.
mixin template
може містити будь-яку кількість складних виразів, які
вставляються на момент конкретизації. Попрощайтеся з препроцесором,
якщо прийшли до нас з мови C!
Шаблон може бути визначений з будь-яким числом обмежень, які забезпечують перевірку властивостей, які повинен мати тип:
void foo(T)(T value)
if (is(T : int)) { // foo!T дійсний лише, якщо T
// конвертується у int
}
Обмеження можуть бути об'єднані у логічний вираз і, навіть, можуть
містити виклики функцій, які будуть викликані під час компіляції.
Наприклад, std.range.primitives.isRandomAccessRange
перевіряє чи тип
є діапазоном, який підтримує оператор []
.