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.
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
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
Ç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
#include
#include
#include
using namespace std;
templaten;
void print(T value)
{
cout < < "value : " << value << endl; } template void print1(Y Sum){cout<<"Sum of a+b:"<
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
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;
templaten;
void print(T value)
{
cout < < "value : " << value << endl; } template void print1(Y Sum){cout<<"Sum of a+b:"<
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();
}
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
class anahtar kelimesi varken typename ne icindir?