Template bir anahtar sözcüktür. Template anahtar sözcüğünden sonra < > gelmelidir. < > arasındaki class anahtar sözcüğünün normal sınıf işlemleriyle hiçbir ilgilisi yoktur. class anahtar sözcüğü yerine 1996 standardizasyonunda typename anahtar sözcüğü de kullanılabilir. class anahtar sözcüğünden sonra isimlendirme kuralına göre herhangi bir isim yazılır. Bu isim bir tür belirtir. Template fonksiyonlar ve Template sınıflar birer şablondur. Yani kendi başlarına kodda yer kaplamazlar. Bir template fonksiyon çağırıldığında derleyici önce çağırılma ifadesindeki parametre yapısını inceler. Bu türe uygun olarak şablonda belirtilen fonksiyondan programcı için yazar.
1 2 |
template <class(typename) T> [geri dönüş değeri]<fonksiyon ismi>([parametreler]) {} |
1 2 |
template <class T> void fonk(T a) {} |
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream.h> template <class T> void fonk(T a) { cout << a << endl; } void main(void) { fonk(3.5); fonk(30L); fonk(40L); } |
Template fonksiyonlarda tür belirten sözcüğe template argümanı denir. Template argümanının template fonksiyon parametre yapısı içerisinde gözükmesi zorunludur. Zaten gözükmemesi durumu da anlamsız olur. Bu template argümanı geri dönüş değeri olarak ya da fonksiyon içerisinde tür belirten sözcük olarak kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream.h> template <class T> T abs(T a) { return a > 0 ? a : -a; } void main(void) { cout << abs(-3.5) << endl; cout << abs(-3) << endl; cout << abs(-10L) << endl; } |
Bir template fonksiyon birden fazla farklı template argümanına sahip olabilir. Bu durumda pek çok kombinasyon söz konusu olabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream.h> template <class A, class B> void fonk(A a, B b) { cout << a << endl << b << endl; } void main(void) { fonk(20L, 100); fonk(100, 20L); fonk(1.3, 10L); fonk('c', 12); } |
Template fonksiyonlar çağırıldığında uygun parametre yapısı bulunamazsa hata durumu oluşabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream.h> template <class T> void swap(T *a, T *b) { T temp; temp = *a; *a = *b; *b = temp; } void main(void) { int x = 10, y = 20; swap(&x, &y); cout << "x = " << x << " " << "y = " << y << endl; } |
Bir template fonksiyon içerisinde başka bir template fonksiyon çağırılmış olabilir. Template argümanı bir sınıf da olabilir. Bir template fonksiyonuyla aynı isimli normal bir fonksiyon bir arada bulunabilir. Bu durumda iki anlamlılık hatası oluşmaz. Normal fonksiyonun template fonksiyona karşı bir üstünlüğü vardır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream.h> template <class T> void swap(T *a, T *b) { T temp; temp = *a; *a = *b; *b = temp; } template <class T> void sort(T *p, int size) { int i = 0, j = 0; for (i = 0; i < size - 1; ++i) for (j = i + 1; j < size; ++j) if (p[i] > p[j]) swap(p + i, p + j); } void main(void) { int a[5] = {3, 8, 4, 7, 6}; int i; sort(a, 5); for (i = 0; i < 5; ++i) cout << a[i] << endl; } |
Template Fonksiyonlar bir şablon belirtir ve kütüphaneye yerleştirilemez. Bu yüzden header dosyalarının içerisine yazılmalıdır.
Template sınıflarda derleyici nesne tanımlama biçimine uygun bir sınıfın üye fonksiyonlarının hepsini yazar.
1 2 |
template <class T> class X {}; |
Bu template argümanı sınıf bildiriminin içerisinde ve bütün üye fonksiyonların içerisinde tür belirten sözcük olarak kullanılabilir. Uygulamada ağırlıklı bir biçimde template sınıflar kullanılmaktadır. Bir tenplate sınıfa ilişkin üye fonksiyon sınıfın dışında aşağıdaki syntax biçimine uygun yazılmak zorundadır.
1 2 3 4 |
template <class T> [geri_dönüş_değeri] sınıf_ismi<T>::fonksiyon_ismi(parametreler) { } |
1 2 |
template <class T> void X<T>::fonk(void) {} |
Bir template sınıfa ilişkin sınıf nesnesi şöyle tanımlanır:
1 |
sınıf_ismi <tür ismi> nesne_ismi; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <stdio.h> #include <stdlib.h> template <class X> class Array { private: int size; X *p; public: Array(void); Array(int n); X &operator[](int n); }; template <class X> Array<X>::Array(void) { size = 10; p = new X[size]; } template <class X> Array<X>::Array(int n) { size = n; p = new X[size]; } template <class X> X &Array<X> erator[](int n) { if (n >= size) { printf("Out of range\n"); exit(1); } return p[n]; } void main(void) { Array<float> n(5); for (int k = 0; k < 5; ++k) n[k] = k; for (k = 0; k < 10; ++k) printf("%f\n", n[k]); } |
One Reply to “Template fonksiyon ve sınıfları hakkında”
Comments are closed.