Fonksiyon Template Özelleştirme

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Yazılım
Seçkin Üye
Katılım
14 Nis 2019
Mesajlar
492
Tepki puanı
351
Ödüller
5
Yaş
27
Sosyal
7 HİZMET YILI
:yazı:
Verilen tip için template bir fonksiyon oluştururken, derleyici template fonksiyonun bir kopyasını çıkartır ve template tip parametrelerini istenilen tiplerle değiştirir. Bu, özel bir fonksiyonun oluşturulan her tip için aynı uygulamaya sahip olması anlamına gelmektedir. Genellikle böyle olması istenir, bazen de belirli bir veri tipi için template fonksiyonu farklı implemente etmek gereken durumlar oluşabilir.

C++:
template <class T>
class Depo
{
private:
T m_deger;
public:
Depo(T deger){
m_deger = deger;
}

C++:
~Depo(){}

void yazdir(){
std::cout << m_deger << std::endl;
}
};


Yukarıdaki verdiğim kod çoğu veri tipi için düzgün çalışacaktır:
C++:
int main()
{
Depo<int> iDeger(5);
Depo<double> dDeger(6.7);

iDeger.yazdir();
dDeger.yazdir();

return 0;
}
Ekran Çıktısı:
5
6.7



Eğer sadece double değerleri bilimsel notasyonla yazdırmak istenirse fonksiyon template özelleştirme kullanılabilir. Oluşturulması gayet basittir: özelleştirilen fonksiyon tanımlanır (üye fonksiyonsa sınıf tanımlamasının dışında yapılır), template tipleri istenilen tiplerle değiştirilir.
C++:
template <>
void Depo<double>::yazdir(){
std::cout << std::scientific << m_deger << std::endl;
}
Derleyici Depo<double>::yazdir()

fonksiyonunu oluşturacağı zaman zaten bu fonksiyonun oluşturulduğunu görecek ve bir kopya oluşturmak yerine bu fonksiyonu kullanacaktır.
template <> derleyiciye bunun bir template fonksiyon olduğunu fakat herhangi bir template parametre bulundurmadığını belirtir.

Ekran Çıktısı:
5
6.700000e+000

Şimdi, template özelleştirmenin kullanışlı olabileceği bir örneğe bakalım. Template Depo sınıfını char* veri tipiyle kullandığımızda ne olduğunu görelim:


C++:
int main()
{
//Dinamik olarak geçici bir string için yer ayrılır
char* string = new char[40];

std::cout << "Isim: ";
std::cin >> string;

//string depolanır
Depo<char*> deger(string);

//geçici string silinir
delete[] string;

//değer yazdırılır
deger.yazdir();
}

Depo char* tipi için oluşturulduğunda Storage<char*> yapıcı fonksiyonu aşağıda gösterdiğim gibi şöyle gözükür:


C++:
template <>
Depo<char*>: Depo(char* deger){
m_deger = deger;
}


Diğer bir deyimle sadece işaretçi ataması yapılır. Sonuç olarak m_deger string olarak aynı hafıza alanına işaret eder. main() içerisinde string silindiğinde m_deger’in işaret ettiği değeri silinmiş olunur. Bu yüzden yazdırılmaya çalışıldığında alakasız bir çıktı alınır.
Bu sorun template özelleştirme ile çözülebilir. İşaretçi ataması yerine yapıcı aşağıda kodlarını vermiş olduğum fonksiyona girilen stringin kopyası oluşturtulur.


C++:
template <>
Depo<char*>: Depo(char* deger){
int uzunluk = 0;
while (deger[uzunluk] != 0)
++uzunluk;
++uzunluk;
m_deger = new char[uzunluk];
for(int sayac = 0; sayac < uzunluk; ++sayac)
m_deger[sayac] = deger[sayac];
}
Artık Depo<char*> tipinde bir değişken için yer alınırken varsayılan yerine bu yapıcı fonksiyon kullanılacak. Sonuç olarak m_deger stringin bir kopyasını alacak yani string silindiğinde m_deger etkilenmeyecektir.
Yalnız Depo<char*> tipi için hafıza sızıntısı oluşacaktır çünkü m_deger silinmeyecektir. Bu da Depo<char*> yıkıcı fonksiyonunun özelleştirilmesiyle çözülebilir:

C++:
template <>
Depo<char*>::~Depo(){
delete[] m_deger;
}


Umarım Faydalı Olmuştur....
 
Son düzenleme:
ACILAR VE KEDER
Seçkin Üye
Katılım
30 Ara 2018
Mesajlar
312
Çözümler
1
Tepki puanı
24
Ödüller
7
7 HİZMET YILI
yararlı konu sağol :)
 
Seçkin Üye
Katılım
28 Mar 2018
Mesajlar
400
Çözümler
1
Tepki puanı
15
Yaş
30
8 HİZMET YILI
sağol kardeşim saol.
 
Onaylı Üye
Katılım
27 Ocak 2020
Mesajlar
82
Tepki puanı
6
Ödüller
5
Yaş
44
6 HİZMET YILI
bişe sorabılırmıyım 50 mesaj olunca hile ındırebılıormuyuz :D
 
C̶a̶r̶p̶e̶ ̶D̶i̶e̶m̶
Seçkin Üye
Katılım
24 Mar 2019
Mesajlar
325
Çözümler
3
Tepki puanı
15
Ödüller
4
Yaş
27
7 HİZMET YILI
emeğine sağlık uğraşmışsın baya :)
 
Acemi Mühendis
Seçkin Üye
Katılım
12 Nis 2018
Mesajlar
350
Çözümler
2
Tepki puanı
65
Ödüller
7
Yaş
30
8 HİZMET YILI
İncelediğimde biraz karmaşık yazı gibi gözüküyor olsa da mantıken güzel konu. Teşekkür ederim. :)
 
Onaylı Üye
Katılım
6 Nis 2020
Mesajlar
51
Tepki puanı
0
Ödüller
3
6 HİZMET YILI
gayet sade ve kolay anlaşılır bir paylaşım emeğine sağlık dostum
 
Seçkin Üye
Katılım
6 Eki 2018
Mesajlar
306
Çözümler
1
Tepki puanı
76
Ödüller
7
7 HİZMET YILI
eline sağlık dostum çok güzel anlatmışsın arşivime ekliyorum
 
Seçkin Üye
Katılım
15 Mar 2016
Mesajlar
310
Çözümler
2
Tepki puanı
7
Ödüller
7
Yaş
24
10 HİZMET YILI
eline sağlık hocam favladım lazım olur elbet bir gün
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst