byanigli
Hectopat
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.
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.
Aslında hatalı durumlardan kurtulacağımız 3 tane yol vardır.
1. Yol : static casting
2. T parametresinin türünü belirlemek
3. Farklı türlerde parametre belirlemek
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.
1.4. overloading fonksiyon Template
Sıradan fonksiyonlar gibi , fonksiyon templateleride overload olabilir.
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);
}