Шаблонне метапрограмування

Якщо Ви коли-небудь зв’яжетеся з шаблонним метапрограмуванням у мові 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 перевіряє чи тип є діапазоном, який підтримує оператор [].

Поглиблення

Основні посилання

Додаткові посилання

rdmd playground.d