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.

  1. Fonksiyon şablonları (Function Templates)
  2. 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.

Yorumlar

  1. Kadir Erdem Demir

    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

  2. Şadi Evren ŞEKER Article Author

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

  3. Kadir Erdem Demir

    Ç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

  4. serap

    #include
    #include
    #include
    using namespace std;

    template
    void print(T value)
    {
    cout < < "value : " << value << endl; } template void print1(Y Sum){cout<<"Sum of a+b:"<n;
    for(int i=1;i< =n;i++) { cout<<"Enter a["<a;
    cout< <"Enter b["<b;
    print(a);
    print(b);
    Sum[i]=a[i]+b[i];
    print1(Sum);
    }

    getch();
    }

    template kullanarak yaptim ama sonuc sum gostermiyor neden acaba array kullandim

  5. serap

    bana yardim edin bu programda iki sayinin toplami arrayda kactane toplamamiz n sayisi bize bagli ama sonuc toplamayi gostermiyor

    #include
    #include
    #include
    using namespace std;

    template
    void print(T value)
    {
    cout < < "value : " << value << endl; } template void print1(Y Sum){cout<<"Sum of a+b:"<n;
    for(int i=1;i< =n;i++) { cout<<"Enter a["<a;
    cout< <"Enter b["<b;
    print(a);
    print(b);
    Sum[i]=a[i]+b[i];
    print1(Sum);
    }

    getch();
    }

  6. Şadi Evren ŞEKER Article Author

    kodunuz okunur bir şekilde ulaşmamış. Yorum kısmına copy / paste ile kod kopyalandığında html kodları ile karışıyor ve bazı semboller görülmüyor dilerseniz bana sitedeki mail adresimden kodu yollayabilirsiniz inceleyip cevabını sitede yayınlamaya çalışırım.

    başarılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir