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) {
// ...
}