D Programlama - Şablonlar
Şablonlar, herhangi bir türden bağımsız bir şekilde kod yazmayı içeren genel programlamanın temelidir.
Şablon, genel bir sınıf veya işlev oluşturmak için bir plan veya formüldür.
Şablonlar, derleyicinin program kodunu otomatik olarak oluşturması için kodu bir kalıp olarak tanımlamaya izin veren özelliktir. Kaynak kodun bazı kısımları, o kısım programda gerçekten kullanılana kadar doldurulmak üzere derleyiciye bırakılabilir. Derleyici eksik kısımları doldurur.
İşlev Şablonu
Bir işlevi şablon olarak tanımlamak, daha sonra derleyici tarafından çıkarılmak üzere, kullandığı türlerden bir veya daha fazlasını belirtilmemiş olarak bırakır. Belirtilmemiş olarak bırakılan türler, işlevin adı ile işlev parametre listesi arasında yer alan şablon parametre listesinde tanımlanır. Bu nedenle, işlev şablonlarının iki parametre listesi vardır -
- şablon parametre listesi
- fonksiyon parametre listesi
import std.stdio;
void print(T)(T value) {
writefln("%s", value);
}
void main() {
print(42);
print(1.2);
print("test");
}
Yukarıdaki kodu derler ve çalıştırırsak, bu aşağıdaki sonucu üretir -
42
1.2
test
Çoklu Tip Parametreli Fonksiyon Şablonu
Birden fazla parametre türü olabilir. Aşağıdaki örnekte gösterilmiştir.
import std.stdio;
void print(T1, T2)(T1 value1, T2 value2) {
writefln(" %s %s", value1, value2);
}
void main() {
print(42, "Test");
print(1.2, 33);
}
Yukarıdaki kodu derler ve çalıştırırsak, bu aşağıdaki sonucu üretir -
42 Test
1.2 33
Sınıf Şablonları
Fonksiyon şablonlarını tanımlayabildiğimiz gibi, sınıf şablonları da tanımlayabiliriz. Aşağıdaki örnek, Stack sınıfını tanımlar ve öğeleri yığından itmek ve açmak için genel yöntemler uygular.
import std.stdio;
import std.string;
class Stack(T) {
private:
T[] elements;
public:
void push(T element) {
elements ~= element;
}
void pop() {
--elements.length;
}
T top() const @property {
return elements[$ - 1];
}
size_t length() const @property {
return elements.length;
}
}
void main() {
auto stack = new Stack!string;
stack.push("Test1");
stack.push("Test2");
writeln(stack.top);
writeln(stack.length);
stack.pop;
writeln(stack.top);
writeln(stack.length);
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
Test2
2
Test1
1