Шаблони

D дозволяє визначати шаблонні функції, аналогічні функціям C++ і Java, якi представляють собою засiб для визначення узагальнених функцій або об'єктiв, які працюють з будь-яким типом, який компілюється з виразом всередині тіла функції:

auto add(T)(T lhs, T rhs) {
    return lhs + rhs;
}

Параметр шаблону Т задається у дужках перед фактичними параметрами функції. Т є міткою, яка замінюється компілятором коли функція насправді інстанціюється (створюється екземпляр) за допомогою оператора !:

add!int(5, 10);
add!float(5.0f, 10.0f);
// не скомпiлюється, так як
// Animal не iмплементує опрератор "+"
add!Animal(dog, cat);

Якщо параметр шаблону не заданий для шаблонної функції, компілятор намагається вивести тип, використовуючи вхідні параметри, з якими функція викликається:

int a = 5; int b = 10;
add(a, b); // T виведеться, як `int`
float c = 5.0f;
add(a, c); // ПОМИЛКА: конфлікт, тому що компілятор
           // не знає, яким повинен бути тип T

Функція може мати будь-яку кількість параметрів шаблону, якi визначаються під час створення екземпляру за допомогою синтаксису func!(T1, T2 ..). Параметри шаблону можуть бути будь-якого базового типу, у тому числі рядками та числами з плаваючою комою.

На відміну від узагальнень (generics) у Java, шаблони D iнстанціюються тiльки пiд час компіляції та генерують високооптимізований код, адаптований під певний набір типів, які використовуються фактично пiд час виклику функцій.

Звичайно, типи struct, class та interface теж можуть бути визначені, як шаблоннi типи:

struct S(T) {
    // ...
}

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

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

rdmd playground.d