Şablonlar (Templates)
Yazan : Şadi Evren ŞEKER
Bilgisayar mühendisliğinin pek çok alanında kullanılan şablonlar, programlama dillerinde bir fonksiyon (function) veya programın bir parçasının farklı değişken tipleri için kulllanılmasını sağlarlar.
Örneğin JAVA ve C++ dillerinde kullanılan bu özelliği bu yazı kapsamında açıklamaya çalışacağız.
Örneğin aşağıdaki kod parçasını ele alalım:
template<typename T> template<class T>
Yukarıdaki ilk satırda bir tip ile şablon (template) tanımlanmışken ikinci satırda bir sınıf (class) ile şablon tanımlanmıştır.
Yani kullanılacak olan şablona T ismi verilmiş ve bu şablonun tipi bir ilkel veri tipi (primitive data type) (int,char, float gibi) ile tanımlanmış veya bir sınıf (class) kullanılarak tanımlanmıştır.
Nesne yönelimli programlama dillerinde kullanılan şablonları ikiye ayırmak mümkündür.
- Fonksiyon şablonları (Function Templates)
- Sınıf şablonları (Class Templates)
Kabaca aşağıdaki şekilde tanımlanabilirler. Fonksiyon şablonu için:
template <class degisken> fonksiyontanimi; template <typename degisken> fonksiyontanimi;
Sınıf şablonları (class templates) aşağıdaki şekilde tanılmanabilirler.
template <class degisken> siniftanimi; template <typename degisken> siniftanimi;
Örneğin C++ dilinde 4 farklı tip için (int, double, string ve boolean) değeri ekrana basan bir fonksiyon ve bu fonksiyonu kullanan kod verilmiştir:
#include<iostream> #include<string> using namespace std; template<typename T> void yazdir(T deger) { cout << "deger : " << deger << endl; } int main() { int i=5; double d=5.5; string s("Merhaba Dunya"); bool b=true; yazdir(i); // T int yazdir(d); // T double yazdir(s); // T string yazdir(b); // T bool return 0; }
Yukarıdaki kodda görüldüğü üzere 4 farklı tip için değerleri ekrana basmaktadır.
Yukarıda fonksiyon şablonları için görülen örneğin yanına bir de sınıf şablonları için aşağıdaki örneği inceleylim:
#include <iostream>
#include <string>
using namespace std;
template <class T>
class Stack
{
public:
Stack();
void push(T i);
T pop();
private:
int top;
T st[100];
};
template <class T>
Stack<T>::Stack()
{
top = -1;
}
template <class T>
void Stack<T>::push(T i)
{
st[++top] = i;
}
template <class T>
T Stack<T>::pop()
{
return st[top--];
}
int main ()
{
Stack<int> int_stack;
Stack<string> str_stack;
int_stack.push(10);
str_stack.push("Merhaba");
str_stack.push("Dunya");
cout << int_stack.pop() << endl;
cout << str_stack.pop() << endl;
cout << str_stack.pop() << endl;
return 0;
}
Yukarıdaki kodda örnek olarak bir dizi üzerine kurulu bir yığın (stack) kodu verilmiştir. Bu yığın içerisine istenilen tipte veri eklenebilmektedir. Örnek olarak yukarıdaki kodda aynı yığın (stack) içerisine hem int hem de string tipinde veri eklenmiştir.
« fstream (File Stream, Dosya Akışı) | Birlik (Union, İttihad) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Şablonlar (Templates)' isimli yazı 20 Apr 2009 tarihinde, saat: 16:06 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 783 defa okunmuştur.
Benzer yazıları C/C++, JAVA, Programlama Dilleri, veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Bağlantılar
template < class T , class container = deque > bu bildirimi anlamaya çalışıyorum sınıf şablonları hakkında pek bir kaynak bulamadım bildirim bir apadtor sınıfın deque containerını kullanması ile ilgili ama template sentaxından bir şey anlayamıyorum bunu nasıl yaptığını yardım lütfen sadece yukardaki sentaks için
kodun tamamını yazarsanız daha kesin birşeyler söyleyebilirim ama veri yapılarında (data structures) sıkça kullanılan aşağıdaki tanım için açıklama yapmaya çalışayım:
template < class T, class Container = deque<T> >
class stack ;
Yukarıdaki iki satırsa stack isminde bir sınıf (Class) tanımlanmış ve bu sınıfın Container sınıfı deque<T> olarak belirtilmiştir.
Bu tanım genelde bir veri yapısının içerisinde farklı bir veri yapsının kullanılması istendiğinde yapılır. Örneğin yukarıdaki tanımda stack (yığın) veri yapısı içerisinde çift uçlu sıra (double ended queue) sınıfı kullanılmış ve bu kullanım bir şablonla (template) tanımlanmıştır.
Örneğin bu yığın sınıfının (stack class) tutacağı veri tipi integer ise T tipi int olacak dolayısıyla container sınıfımız da int tipinden tanımlanmış bir deque olacaktır.
Stack sınıfımızın içinde bu tanımlamadan sonra artık integer tipinde bir double ended queue kullanabileceğiz.
Farklı bir durum olarak yığınımızı (Stack) char tipinden tanımladığımızda, container sınıfmızda otomatik olarak char tipinde bir double ended queue olacaktır.
Yani sizin yazdığınız yapıda veya yukarıdaki yapıda kodda kullanılmak üzere bir container sınıfı tanımlanmakta (ki bu genelde verinin saklanacağı sınıftır (class)) ve bu sınıfın tipi şablon içinde tanımlanmaktadır.
Umarım yardımcı olur.
Başarılar
Şadi Evren ŞEKER
Çok çok teşekkür ederim benim sorunum ki hala tam emin değilim anladığım kadar şimdilik kabul edicem iki değişik template tanımlaması var biri “class T” biri “class Container = deque” bu sentaksa ben bi tek fonksiyon şablonlarını bildiğim için alışık değilim ama sizin anllattığınız kadarıyla sadece bir yane template değişkeni olduğunu birisinin container birisininde bunun türünü belirlediğini düşünüyorum . İlgilendiğiniz için çok sağolun