templates c with examples
Poznaj różne aspekty szablonów w C ++.
Szablony to jedna z najpotężniejszych funkcji w C ++. Szablony dostarczają nam kod niezależny od typu danych.
Innymi słowy, korzystając z szablonów, możemy napisać ogólny kod działający na dowolnym typie danych. Musimy tylko przekazać typ danych jako parametr. Ten parametr, który przekazuje typ danych, jest również nazywany nazwą typu.
W tym samouczku szczegółowo omówimy wszystkie szablony i ich różne aspekty.
=> Kliknij tutaj, aby zapoznać się z serią szkoleń Absolute C ++.
Czego się nauczysz:
- Co to są szablony?
- Jak korzystać z szablonów / implementacji?
- nazwa typu Vs. słowo kluczowe class
- Tworzenie i specjalizacja szablonów
- Specjalizacja szablonów
- Szablony Variadic C ++
- Wniosek
- rekomendowane lektury
Co to są szablony?
Jak wspomniano powyżej, szablony są ogólne, tj. Niezależne od typu danych. Szablony są używane głównie w celu zapewnienia możliwości ponownego wykorzystania kodu i elastyczności programów. Możemy po prostu stworzyć prostą funkcję lub klasę, która przyjmuje typ danych jako parametr i zaimplementować kod, który działa dla dowolnego typu danych.
Na przykład, jeśli chcemy, aby algorytm sortowania działał dla wszystkich liczbowych typów danych, a także dla ciągów znaków, po prostu napiszemy funkcję, która przyjmuje typ danych jako argument i zaimplementujemy technikę sortowania.
Następnie w zależności od typu danych (nazwy typu), które są przekazywane do algorytmu sortowania, możemy posortować dane niezależnie od typu danych. W ten sposób nie musimy pisać dziesięciu algorytmów dla dziesięciu typów danych.
Dlatego szablony mogą być używane w aplikacjach, w których wymagamy, aby kod był używany dla więcej niż jednego typu danych. Szablony są również używane w aplikacjach, w których możliwość ponownego wykorzystania kodu ma pierwszorzędne znaczenie.
Jak korzystać z szablonów / implementacji?
Szablony można zaimplementować na dwa sposoby:
- Jako szablon funkcji
- Jako szablon zajęć
Szablon funkcji
Szablon funkcji jest podobny do zwykłej funkcji, ale jedyną różnicą jest to, że normalna funkcja może działać tylko na jednym typie danych, a kod szablonu funkcji może działać na wielu typach danych.
Chociaż w rzeczywistości możemy przeciążyć normalną funkcję do pracy na różnych typach danych, szablony funkcji są zawsze bardziej przydatne, ponieważ musimy napisać jedyny program i może on działać na wszystkich typach danych.
Następnie zobaczymy implementację szablonów funkcji.
Ogólna składnia szablonu funkcji jest następująca:
template T function_name(T args){ …… //function body }
Tutaj T jest argumentem szablonu, który akceptuje różne typy danych, a klasa jest słowem kluczowym. Zamiast słowa kluczowego class możemy również wpisać „nazwa typu”.
Gdy określony typ danych jest przekazywany do nazwa_funkcji, kompilator tworzy kopię tej funkcji z tym typem danych jako argumentem i funkcja jest wykonywana.
Zobaczmy przykład, aby lepiej zrozumieć szablony funkcji.
#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<Szablony klas Podobnie jak w przypadku szablonów funkcji, możemy wymagać posiadania klasy podobnej do wszystkich innych aspektów, ale tylko z różnymi typami danych.
W tej sytuacji możemy mieć różne klasy dla różnych typów danych lub różne implementacje dla różnych typów danych w tej samej klasie. Ale zrobienie tego spowoduje, że nasz kod będzie nieporęczny.
Najlepszym rozwiązaniem jest użycie klasy szablonu. Klasa Template również zachowuje się podobnie do szablonów funkcji. Musimy przekazać typ danych jako parametr do klasy podczas tworzenia obiektów lub wywoływania funkcji składowych.
Ogólna składnia szablonu klasy to:
template class className{ ….. public: T memVar; T memFunction(T args); };
W powyższej definicji T pełni rolę symbolu zastępczego dla typu danych. MemVar i memFunction członków publicznych również używają T jako symbolu zastępczego dla typów danych.
Po zdefiniowaniu klasy szablonu w powyższy sposób możemy tworzyć obiekty klas w następujący sposób:
className classObejct1; className classObject2; className classObject3;
Zaimplementujmy przykładowy kod, aby zademonstrować szablony klas:
#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 = '< Wynik:
Maksymalnie 100 i 75 = 100
Maksymalnie „A” i „a” = a
Powyższy program implementuje przykład szablonu klasy. Mamy myclass klasy szablonu. Wewnątrz mamy konstruktora, który zainicjuje dwa elementy członkowskie a i b klasy. Istnieje jeszcze jedna funkcja członkowska getMaxval, która jest również szablonem funkcji zwracającym maksymalnie a i b.
W funkcji main konstruujemy dwa obiekty, myobject typu integer oraz mychobject typu character. Następnie wywołujemy funkcję getMaxval na każdym z tych obiektów, aby określić maksymalną wartość.
Należy zauważyć, że oprócz parametrów typu szablonu (parametry typu T), funkcje szablonu mogą również mieć zwykłe parametry, takie jak zwykłe funkcje, a także domyślne wartości parametrów.
nazwa typu Vs. słowo kluczowe class
Deklarując klasę lub funkcję szablonu używamy jednego z dwóch słów kluczowych class lub typename. Te dwa słowa są semantycznie równoważne i mogą być używane zamiennie.
wejściowe pliki wyjściowe c ++
Ale w niektórych przypadkach nie możemy używać tych słów jako odpowiedników. Na przykład, kiedy używamy zależnych typów danych w szablonach, takich jak „typedef”, używamy typename zamiast class.
Ponadto słowo kluczowe class musi być użyte, gdy musimy jawnie utworzyć instancję szablonu.
Tworzenie i specjalizacja szablonów
Szablony są napisane w sposób ogólny, co oznacza, że jest to ogólna implementacja niezależnie od typu danych. Zgodnie z podanym typem danych musimy wygenerować konkretną klasę dla każdego typu danych.
Na przykład, jeśli mamy algorytm sortowania według szablonu, możemy wygenerować konkretną klasę dla sortowania, inną klasę dla sortowania, itd. Nazywa się to instancją szablonu.
Zastępujemy argumenty szablonu (rzeczywiste typy danych) za parametry szablonu w definicji klasy szablonu.
Na przykład,
template class sort {};
Kiedy przekazujemy typ danych, kompilator podstawia typ danych dla „T”, tak aby algorytm sortowania stał się sortowaniem.
Za każdym razem, gdy używamy klasy lub funkcji szablonu, istnieje potrzeba wystąpienia, gdy przekazujemy określony typ danych. Jeśli to wystąpienie nie jest jeszcze obecne, kompilator tworzy go z określonym typem danych. To jest niejawna instancja.
Jedną z wad niejawnego tworzenia instancji jest to, że kompilator generuje klasę instancji tylko dla aktualnie używanych argumentów. Oznacza to, że jeśli chcemy wygenerować bibliotekę instancji przed użyciem tych instancji, musimy przejść do jawnej instancji.
Przykład deklaracji szablonu podano poniżej:
template class Array(T)
Może być jawnie utworzony jako:
template class Array
Podczas tworzenia instancji klasy tworzone są również instancje wszystkich jej członków.
Specjalizacja szablonów
Podczas programowania z wykorzystaniem szablonów możemy spotkać się z sytuacją, w której możemy wymagać specjalnej implementacji dla określonego typu danych. W takiej sytuacji decydujemy się na specjalizację szablonową.
W specjalizacji szablonowej wdrażamy specjalne zachowanie dla określonego typu danych poza oryginalną definicją szablonu dla innych typów danych.
Na przykład, uważam, że mamy klasę szablonu myIncrement ” który ma konstruktora do zainicjowania wartości i funkcji szablonu toIncrement co zwiększa wartość o 1.
Ta konkretna klasa będzie działać doskonale dla wszystkich typów danych z wyjątkiem char. Zamiast zwiększać wartość znaku char, dlaczego nie nadać mu specjalnego zachowania i zamiast tego przekonwertować znak na wielkie litery?
Aby to zrobić, możemy wybrać specjalizację szablonową dla typu danych char.
Ta implementacja jest pokazana w poniższym przykładzie kodu.
#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: '< Wynik:
Zwiększona wartość int: 8
Wielkie litery: S
Zwiększona podwójna wartość: 12
W powyższym programie, który demonstruje specjalizację szablonów, zobacz, w jaki sposób zadeklarowaliśmy specjalny szablon dla typu char. Najpierw deklarujemy oryginalną klasę, a następnie „specjalizujemy” ją dla typu char. Aby rozpocząć specjalizację, używamy pustej deklaracji szablonu „szablon”.
Następnie po nazwie klasy podajemy typ danych. Po tych dwóch zmianach klasa jest zapisywana dla typu char.
W funkcji głównej zwróć uwagę, że nie ma różnicy między tworzeniem instancji typu char a innymi typami. Jedyna różnica polega na tym, że przedefiniowaliśmy klasę specjalistyczną.
Zauważ, że musimy zdefiniować wszystkie składowe klasy specjalistycznej, mimo że są one dokładnie takie same w ogólnej / oryginalnej klasie szablonu. Dzieje się tak, ponieważ nie mamy funkcji dziedziczenia dla członków z szablonu ogólnego do szablonu specjalistycznego.
Szablony Variadic C ++
Do tej pory widzieliśmy szablony funkcji, które przyjmują stałą liczbę argumentów. Istnieją również szablony, które przyjmują zmienną liczbę argumentów. Te szablony funkcji nazywane są szablonami wariadycznymi. Szablony Variadic to jedna z najnowszych funkcji C ++ 11.
datastage pytania do wywiadów i odpowiedzi dla doświadczonych
Szablony variadic przyjmują zmienną liczbę argumentów, które są bezpieczne dla typów, a argumenty są rozwiązywane w czasie kompilacji.
Aby to zrozumieć, weźmy pełny przykład programowania.
#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 = '< Powyższy przykład demonstruje funkcję wariadyczną „sumowanie”. Jak pokazano powyżej, najpierw potrzebujemy funkcji podstawowej, która implementuje przypadek podstawowy. Następnie implementujemy funkcję wariadyczną na wierzchu tej funkcji.
W sumowaniu funkcji zmiennej wywoływana jest nazwa „typename… args” pakiet parametrów szablonu podczas gdy nazywa się „Args… args” pakiet parametrów funkcji .
Po napisaniu szablonu funkcji, który implementuje przypadek podstawowy, piszemy funkcję wariadyczną, która implementuje przypadek ogólny. Funkcja wariadyczna jest zapisana podobnie do rekurencji, jak pokazano dla sumowania (argumenty…). Pierwszy argument jest oddzielony od pakietu parametrów funkcji na typ T (pierwszy).
Z każdym wywołaniem sumowania lista parametrów zwęża się o jeden argument i ostatecznie zostaje osiągnięty warunek podstawowy. Dane wyjściowe pokazują sumowanie długich liczb całkowitych i znaków.
Wniosek
Na tym kończymy ten samouczek dotyczący szablonów w C ++. Szablony pomagają nam uczynić nasze programy ogólnymi, tj. Niezależnymi od typu.
Przeczytaj także = >> Samouczek dotyczący szablonu kolby
Programy ogólne zawsze znajdują się na wierzchu innych programów, ponieważ nie musimy pisać oddzielnych programów dla każdego typu danych. Zatem opracowanie ogólnych programów bezpiecznych dla typów może być ważnym krokiem w kierunku wydajnego programowania.
=> Sprawdź szczegółowe samouczki szkoleniowe C ++ tutaj.
rekomendowane lektury
- Samouczek dotyczący głównych funkcji języka Python z praktycznymi przykładami
- Jak działa testowanie oparte na danych (przykłady QTP i selenu)
- Wielowątkowość w C ++ z przykładami
- Python DateTime Tutorial z przykładami
- Przykładowy szablon przypadku testowego z przykładami przypadków testowych (Pobierz)
- Polecenie Cut w systemie Unix z przykładami
- Przykładowy szablon raportu z testu akceptacji z przykładami
- Składnia poleceń Unix Cat, opcje z przykładami