İleri C++ eğitimi, Template kullanımı kısım 1.

byanigli

Hectopat
Katılım
3 Ocak 2014
Mesajlar
543
Yer
İzmir, Turkey, Turkey
Daha fazla  
Cinsiyet
Erkek
Meslek
student of software engineering
Merhaba arkadaslar, bu başlık altında template bir giriş yapacağız. Bir önceki başlıkta birkaç problemi incelemiştik. Template, bu problemleri çözen bir mekanizmadır. Bir önceki konu : İleri c++ eğitimi swap(iki değişkeni yer değiştirme) taktikleri

Template, c++ dilinin desteklediği bir mekanizmadır. Bütün veri türlerini desteklemekte ve scope içersinde işlem yapabilmekteyiz.

1. Fonksiyon Template'i

Fonksiyon template'i çağırıldığı veri türüne göre davranış gösterir. Örnek olarak aşağıdaki kod bloğunu inceleyebiliriz.

Kod:
#include <iostream>

using namespace std;

template <typename T>
inline void my_swap(T& b, T&c)
{
    T temp = b;
    b=c;
    c=temp;
}


int main()
{
   int a = 1;
   int b = 2;
   cout<< "a:" <<a<<" "<< "b: "<<b<< endl;
   my_swap(a,b);
   cout<< "a:" <<a<<" "<< "b: "<<b<< endl;
   string c = ".cpp";
   string d = ".c";
   cout<<"c: " << c<<"  "<< "D: "<< d<< endl;
   my_swap(c,d);
   cout<<"c: " << c<<"  "<< "D: "<< d<< endl;
}

1.1. Fonksiyon Template'lerin tanımlanması
Örneğe baktığımızda, template <typname T> görmekteyiz. burada bir template olduğunu ve içinde T parametresine sahip olduğunu belirtmekteyiz. Typename keyword'u aynı zamanda type parametresi olarakta adlandırılır. mySwap fonksiyonuna baktığımızda ise T türünden 2 tane parametre aldığını görmekteyiz. böylece fonksiyon template tanımlamış olduk.

Tekrar örneği incelediğimizde, dikkat edelim ki, programcının insantiation ayırmasına gerek kalmadı. Bunun sebebi fonksiyon template'i iki defa derlenir. 1. derlemede sadece, sytanx kontrol edilir iken, 2 derlemede bütün çağırların gerçeli olduğunu kontrol eder.

1.2. Argüman Tanımlaması
Bir fonksiyon template'i çağırdığımızda, (örn: max()), template parametrelerini, geçerli olan argüman belirler ve hiç bir otomatik tür dönüşümüne izin vermez. Bütün T parametleri bir birinle tamamen eşleşmelidir.
Kod:
template < typename T>
inline T const &max (T const& t1, T const t2);

max(4,2); // hiç bir problem yok. İki Argümanda int.

max(4,4.2); //  Hata: İlk argüman int, ikinci argüman double or float

Aslında hatalı durumlardan kurtulacağımız 3 tane yol vardır.

1. Yol : static casting

Kod:
max(static_cast<double>(4),4,2)

2. T parametresinin türünü belirlemek
Kod:
max<double>(4,4,2)

3. Farklı türlerde parametre belirlemek


Kod:
template < typename T, typname P>
inline T const &max ( T const& t1, P const p2)
{
   return t1<p2 ? p2: t1;
}

max(4,6.2); //  Bu durum doğru ama T parametersi integer olduğundan 6.2 değerini 6 olarak döndürecektir/CODE]

1.3 Return türü belirlemek

[CODE]
template <typename T1, typename T2, typename RT>
inline RT max( T1 const& a, T2 const &b);

max <int,double,double>(4,4,2);

bu durumda, gördündüğü gibi fonksiyonun türü, double, birinci parametrenin int ikinci parametrenin ise double olduğunu belirtik. yada bir başka yöntem ise sadece fonksiyon türünü belirmede.


Kod:
template <typename RT,typename T1, typename T2 >
inline RT max( T1 const& a, T2 const &b);

max <double>(4,3,2); // bu durumda 4, double türünde dönecektir. 4.0 sıfır olarak

1.4. overloading fonksiyon Template

Sıradan fonksiyonlar gibi , fonksiyon templateleride overload olabilir.
Kod:
int max( T1 const& a, T2 const &b);

template <typename T>
inline T max( T const& a, T const &b);

template <typename T>
inline T max( T const& a, T const &b, T const &c)
{
  return max (max(a,b),c);
}
 
Uyarı! Bu konu 10 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı