Menu

Шаблони

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);

Неявні шаблонні параметри

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

int a = 5; int b = 10;
add(a, b); // T виведеться, як `int`
float c = 5.0;
add(a, c); // T виведеться, як `float`

Властивості шаблону

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

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

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

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

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

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

rdmd playground.d