templates c with examples
C ++ 'da Şablonların Çeşitli Yönlerini Öğrenin.
Şablonlar, C ++ 'daki en güçlü özelliklerden biridir. Şablonlar bize veri türünden bağımsız olan kodu sağlar.
Diğer bir deyişle, şablonları kullanarak herhangi bir veri türü üzerinde çalışan genel bir kod yazabiliriz. Sadece veri tipini parametre olarak iletmemiz gerekiyor. Veri tipini geçen bu parametre aynı zamanda tip adı olarak da adlandırılır.
Bu eğiticide, şablonlar hakkında her şeyi ve çeşitli yönlerini ayrıntılı olarak inceleyeceğiz.
=> Absolute C ++ Eğitim Serisi İçin Tıklayınız.
Ne öğreneceksin:
- Şablonlar Nedir?
- Şablonlar / Uygulama Nasıl Kullanılır?
- typename Vs. sınıf anahtar sözcüğü
- Şablon Örnekleme ve Uzmanlaşma
- Şablon Uzmanlığı
- C ++ Variadic Şablonları
- Sonuç
- Önerilen Kaynaklar
Şablonlar Nedir?
Yukarıda belirtildiği gibi, şablonlar geneldir, yani veri türünden bağımsızdır. Şablonlar, esas olarak programların yeniden kullanılabilirliğini ve esnekliğini sağlamak için kullanılır. Basit bir fonksiyon veya veri tipini parametre olarak alan bir sınıf oluşturabilir ve herhangi bir veri tipi için çalışan kodu uygulayabiliriz.
Örneğin, Bir sıralama algoritmasının tüm sayısal veri türleri ve karakter dizeleri için çalışmasını istiyorsak, o zaman sadece veri türünü bir argüman olarak alan bir fonksiyon yazacağız ve sıralama tekniğini uygulayacağız.
Ardından, sıralama algoritmasına aktarılan veri türüne (tür adı) bağlı olarak, veri türünden bağımsız olarak verileri sıralayabiliriz. Bu şekilde on veri türü için on algoritma yazmamıza gerek kalmaz.
Bu nedenle, kodun birden fazla veri türü için kullanılabilir olmasını istediğimiz uygulamalarda şablonlar kullanılabilir. Şablonlar, kodun yeniden kullanılabilirliğinin birinci derecede önemli olduğu uygulamalarda da kullanılır.
Şablonlar / Uygulama Nasıl Kullanılır?
Şablonlar iki şekilde uygulanabilir:
- Bir işlev şablonu olarak
- Sınıf şablonu olarak
İşlev Şablonu
İşlev Şablonu tıpkı normal bir işlev gibidir, ancak tek fark, normal işlevin yalnızca bir veri türü üzerinde çalışabilmesi ve işlev şablon kodunun birden çok veri türü üzerinde çalışabilmesidir.
Çeşitli veri türleri üzerinde çalışmak için normal bir işlevi gerçekten aşırı yükleyebilirken, işlev şablonları her zaman daha kullanışlıdır, çünkü tek programı yazmamız gerekir ve tüm veri türleri üzerinde çalışabilir.
Sonra, fonksiyon şablonlarının uygulanmasını göreceğiz.
İşlev şablonunun genel sözdizimi şöyledir:
template T function_name(T args){ …… //function body }Burada T, farklı veri türlerini kabul eden şablon argümanıdır ve sınıf bir anahtar sözcüktür. Anahtar kelime sınıfı yerine 'typename' de yazabiliriz.
İşlev_adı 'ya belirli bir veri türü aktarıldığında, bu işlevin bir kopyası bu veri türü ile derleyici tarafından bir argüman olarak yapılır ve işlev çalıştırılır.
İşlev şablonlarını daha iyi anlamak için bir örnek görelim.
#include using namespace std; template void func_swap(T &arg1, T &arg2) { T temp; temp = arg1; arg1 = arg2; arg2 = temp; } int main() { int num1 = 10, num2 = 20; double d1 = 100.53, d2 = 435.54; char ch1 = 'A', ch2 = 'Z'; cout << 'Original data
'; cout << 'num1 = ' << num1 << ' num2 = ' << num2< Ana işlevde, int, double ve char türündeki verileri tanımlarız. Her veri türü için func_swap işlevini çağırıyoruz. Sonra her veri türü için takas edilen verileri görüntüleriz.
Bu, üç veri türü için üç işlev yazmamıza gerek olmadığını gösterir. Yalnızca bir işlev yazmak yeterlidir ve veri türünden bağımsız olması için onu bir şablon işlevi yapar.
Sınıf Şablonları
İşlev şablonlarında olduğu gibi, diğer tüm yönlere benzer, ancak yalnızca farklı veri türlerine sahip bir sınıfa sahip olmamız gerekebilir.
Bu durumda, farklı veri türleri için farklı sınıflara veya aynı sınıftaki farklı veri türleri için farklı uygulamalara sahip olabiliriz. Ancak bunu yapmak kodumuzu hantal hale getirecek.
Bunun için en iyi çözüm, bir şablon sınıfı kullanmaktır. Şablon sınıfı da işlev şablonlarına benzer şekilde davranır. Nesneler oluştururken veya üye işlevleri çağırırken veri türünü parametre olarak sınıfa geçirmemiz gerekir.
Sınıf şablonunun genel sözdizimi şöyledir:
template class className{ ….. public: T memVar; T memFunction(T args); };Yukarıdaki tanımda, T, veri türü için bir yer tutucu görevi görür. Genel üyelerin memVar ve memFunction da veri türleri için yer tutucu olarak T kullanır.
Yukarıdaki gibi bir şablon sınıfı tanımlandıktan sonra, aşağıdaki gibi sınıf nesneleri oluşturabiliriz:
className classObejct1; className classObject2; className classObject3; Sınıf Şablonlarını göstermek için bir kod örneği uygulayalım:
#include using namespace std; template class myclass { T a, b; public: myclass (T first, T second) {a=first; b=second;} T getMaxval (); }; template T myclass::getMaxval () { return (a>b? a : b); } int main () { myclass myobject (100, 75); cout<<'Maximum of 100 and 75 = '< Çıktı:
Maksimum 100 ve 75 = 100
Maksimum 'A' ve 'a' = a
Yukarıdaki program, bir sınıf şablonu örneğini uygular. Sınıfım şablonumuz var. Bunun içinde, sınıfın a ve b iki üyesini başlatacak bir kurucumuz var. Ayrıca, maksimum a ve b döndüren bir işlev şablonu olan getMaxval başka bir üye işlevi daha vardır.
Ana işlevde, tamsayı türünde myobject ve karakter türünde mychobject olmak üzere iki nesne oluşturuyoruz. Ardından, maksimum değeri belirlemek için bu nesnelerin her birinde getMaxval işlevini çağırıyoruz.
Şablon türü parametrelerinden (T tipi parametreler) ayrı olarak, şablon işlevlerinin normal işlevler gibi sıradan parametrelere ve ayrıca varsayılan parametre değerlerine sahip olabileceğini unutmayın.
typename Vs. sınıf anahtar sözcüğü
Şablon sınıfını veya işlevini bildirirken, iki anahtar sözcükten birini kullanırız class veya typename. Bu iki kelime anlamsal olarak eşdeğerdir ve birbirinin yerine kullanılabilir.
Ancak bazı durumlarda bu kelimeleri eşdeğer olarak kullanamayız. Örneğin, 'typedef' gibi şablonlarda bağımlı veri türlerini kullandığımızda, class yerine typename kullanırız.
Ayrıca, bir şablonu açıkça başlatmamız gerektiğinde, class anahtar sözcüğü kullanılmalıdır.
Şablon Örnekleme ve Uzmanlaşma
Şablonlar genel bir şekilde yazılmıştır; bu, veri türünden bağımsız olarak genel bir uygulama olduğu anlamına gelir. Sağlanan veri türüne göre, her veri türü için somut bir sınıf oluşturmamız gerekir.
Örneğin, bir şablon sıralama algoritmamız varsa, sıralama için somut bir sınıf, sıralama için başka bir sınıf vb. oluşturabiliriz. Buna şablonun somutlaştırılması denir.
Şablon sınıfının tanımında şablon parametreleri için şablon bağımsız değişkenlerini (gerçek veri türleri) değiştiririz.
Örneğin,
template class sort {};Veri türünü ilettiğimizde, derleyici veri türünü 'T' yerine koyar, böylece sıralama algoritması sıralanır.
Şablon sınıfını veya işlevini her kullandığımızda, belirli bir veri türünü ilettiğimizde bir örneğe ihtiyaç vardır. Bu örnek zaten mevcut değilse, derleyici belirli veri tipiyle bir tane oluşturur. Bu örtük somutlaştırmadır.
Örtük örneklemenin bir dezavantajı, derleyicinin yalnızca şu anda kullanılan argümanlar için örnek sınıfı oluşturmasıdır. Bu, bu örneklerin kullanımından önce bir örnek kitaplığı oluşturmak istiyorsak, açık somutlaştırmaya gitmemiz gerektiği anlamına gelir.
Şablon beyanına bir örnek aşağıda verilmiştir:
template class Array(T)Açıkça şu şekilde örneklenebilir:
template class ArrayBir sınıf başlatıldığında, tüm üyeleri de başlatılır.
Şablon Uzmanlığı
Şablonları kullanarak programlama yaparken, belirli bir veri türü için özel bir uygulama gerektirebilecek bir durumla karşılaşabiliriz. Böyle bir durum ortaya çıktığında, şablon uzmanlaşmasına gidiyoruz.
Şablon uzmanlaşmasında, diğer veri türleri için orijinal şablon tanımından ayrı olarak belirli bir veri türü için özel bir davranış uygularız.
Örneğin, bir şablon sınıfımız olduğunu düşünün ' myIncrement ’ bir değeri başlatmak için bir kurucu ve bir şablon işlevi olan ToIncrement bu, değeri 1 artırır.
Bu belirli sınıf, char dışındaki tüm veri türleri için mükemmel çalışacaktır. Char için değeri artırmak yerine, neden ona özel bir davranış vermiyor ve bunun yerine karakteri büyük harfe dönüştürmüyorsunuz?
Bunu yapmak için, char veri türü için şablon uzmanlaşmasına gidebiliriz.
android'de apk nasıl açılır
Bu uygulama aşağıdaki kod Örnekte gösterilmektedir.
#include using namespace std; // class template: template class myIncrement { T value; public: myIncrement (T arg) {value=arg;} T toIncrement () {return ++value;} }; // class template specialization: template class myIncrement { char value; public: myIncrement (char arg) {value=arg;} char uppercase () { if ((value>='a')&&(value<='z')) value+='A'-'a'; return value; } }; int main () { myIncrement myint (7); myIncrement mychar ('s'); myIncrement mydouble(11.0); cout<<'Incremented int value: '<< myint.toIncrement()<< endl; cout<<'Uppercase value: '< Çıktı:
Arttırılmış int değeri: 8
Büyük harf değeri: S
Artan çift değer: 12

Şablon uzmanlığını gösteren yukarıdaki programda, char türü için özel bir şablon ilan etme şeklimize bakın. Önce orijinal sınıfı açıklıyoruz ve sonra onu char türü için 'uzmanlaştırıyoruz'. Uzmanlaşmaya başlamak için boş şablon bildirimi 'şablon' kullanıyoruz.
Daha sonra sınıf isminden sonra veri tipini ekliyoruz. Bu iki değişiklikten sonra char türü için sınıf yazılır.
Ana işlevde, char türünün somutlaştırılması ile diğer türler arasında hiçbir fark olmadığını unutmayın. Tek fark, özelleşmiş sınıfı yeniden tanımlamamızdır.
Genel / orijinal şablon sınıfında tamamen aynı olsalar bile özelleşmiş sınıfın tüm üyelerini tanımlamamız gerektiğine dikkat edin. Bunun nedeni, genel şablondan özelleştirilmiş şablona üyeler için miras özelliğimizin olmamasıdır.
C ++ Variadic Şablonları
Şimdiye kadar sabit sayıda argüman alan işlev şablonlarını gördük. Değişken sayıda argüman alan şablonlar da vardır. Bu işlev şablonlarına çeşitli şablonlar denir. Variadic şablonlar, C ++ 11'in en yeni özelliklerinden biridir.
Variadic şablonlar, tür açısından güvenli olan değişken sayıda argüman alır ve argümanlar derleme zamanında çözülür.
Bunu anlamak için eksiksiz bir programlama Örneği alalım.
#include #include using namespace std; template T summation(T val) { return val; } template T summation(T first, Args... args) { return first + summation(args...); } int main() { long sum = summation(1, 2, 3, 8, 7); cout<<'Sum of long numbers = '< Yukarıdaki örnek, değişken işlevi, 'toplama' yı gösterir. Yukarıda gösterildiği gibi, ilk önce temel durumu uygulayan bir temel işleve ihtiyacımız var. Daha sonra bu fonksiyonun tepesine variadic fonksiyonu uygularız.
Değişken işlev toplamında, 'typename… args' denir şablon parametre paketi oysa 'Args ... args' denir işlev parametre paketi .
Temel durumu uygulayan bir fonksiyon şablonu yazdıktan sonra, genel durumu uygulayan bir değişken fonksiyon yazıyoruz. Variadic fonksiyon, toplama için gösterildiği gibi özyinelemeye benzer şekilde yazılır (argümanlar…). İlk argüman, fonksiyon parametre paketinden T tipine (ilk) ayrılır.
Her toplama çağrısıyla, parametre listesi bir bağımsız değişkenle daralır ve sonunda temel koşula ulaşılır. Çıktı, uzun tam sayıların ve karakterlerin toplamını gösterir.
Sonuç
Bununla, bu öğreticiyi C ++ 'daki şablonlarla sonlandırıyoruz. Şablonlar, programlarımızı jenerik, yani türden bağımsız hale getirmemize yardımcı olur.
Ayrıca okuyun = >> Flask Şablon Eğitimi
Her veri türü için ayrı programlar yazmamız gerekmediğinden, genel programlar her zaman diğer programların üstünde durur. Bu nedenle, genel tip güvenli programlar geliştirmek, verimli programlamaya doğru önemli bir adım olabilir.
=> Derinlemesine C ++ Eğitim Öğreticilerine Buradan Bakabilirsiniz.
Önerilen Kaynaklar
- Uygulamalı Örneklerle Python Ana İşlev Eğitimi
- Veriye Dayalı Test Nasıl Çalışır (QTP ve Selenyum Örnekleri)
- Örneklerle C ++ 'da Çoklu Okuma
- Örneklerle Python DateTime Eğitimi
- Test Senaryosu Örnekleriyle Örnek Test Senaryosu Şablonu (İndir)
- Örneklerle Unix'te Kesme Komutu
- Örneklerle Kabul Testi Raporu için Örnek Şablon
- Unix Cat Komut Sözdizimi, Örneklerle Seçenekler
