C ++ šablony

V tomto článku se dozvíte o šablonách v C ++. Naučíte se využívat sílu šablon pro generické programování.

Šablony jsou výkonné funkce jazyka C ++, které vám umožňují psát obecné programy. Jednoduše řečeno, můžete vytvořit jednu funkci nebo třídu pro práci s různými datovými typy pomocí šablon.

Šablony se často používají ve větších databázích pro účely opětovné použitelnosti kódu a flexibility programů.

Koncept šablon lze použít dvěma různými způsoby:

  • Šablony funkcí
  • Šablony tříd

Šablony funkcí

Šablona funkce funguje podobně jako normální funkce, s jedním klíčovým rozdílem.

Šablona jedné funkce může pracovat s různými datovými typy najednou, ale jedna normální funkce může fungovat pouze s jednou sadou datových typů.

Normálně, pokud potřebujete provést identické operace na dvou nebo více typech dat, použijete přetížení funkce k vytvoření dvou funkcí s požadovanou deklarací funkce.

Lepším přístupem by však bylo použití šablon funkcí, protože stejnou úlohu můžete provádět psaním méně a udržovatelného kódu.

Jak deklarovat funkční šablonu?

Šablonu funkce začíná ve tvaru šablony a následně vnitřní šablona parametru / s , který je následně deklaraci funkce.

 template < class T> T someFunction (T arg) (…)

Ve výše uvedeném kódu je T argument šablony, který přijímá různé datové typy (int, float) a třída je klíčové slovo.

typenameVe výše uvedeném příkladu můžete místo třídy použít také klíčové slovo .

Když je předán argument datového typu someFunction( ), kompilátor vygeneruje novou verzi someFunction()pro daný datový typ.

Příklad 1: Šablona funkce pro nalezení největšího čísla

Program k zobrazení největšího ze dvou čísel pomocí funkčních šablon.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Výstup

Zadejte dvě celá čísla: 5 10 10 je větší. Zadejte dvě čísla s plovoucí desetinnou čárkou: 12,4 10,2 12,4 je větší. Zadejte dva znaky: z Z z má větší hodnotu ASCII.

Ve výše uvedeném programu Large()je definována funkční šablona, která přijímá dva argumenty n1 a n2 datového typu T. Tznamená, že argument může být jakéhokoli datového typu.

Large() funkce vrátí největší ze dvou argumentů pomocí jednoduché podmíněné operace.

Uvnitř main()funkce, proměnné tří různých typů dat: int, floata charjsou deklarovány. Proměnné jsou poté předány do Large()šablony funkcí jako normální funkce.

Během běhu, když je celé číslo předáno funkci šablony, kompilátor ví, že musí vygenerovat Large()funkci, aby přijal argumenty int, a dělá to.

Podobně, když jsou předána data s plovoucí desetinnou čárkou a char data, zná datové typy argumentů a Large()podle toho generuje funkci.

Tímto způsobem použití pouze jedné šablony funkce nahradilo tři stejné normální funkce a váš kód byl udržovatelný.

Příklad 2: Výměna dat pomocí šablon funkcí

Programujte výměnu dat pomocí šablon funkcí.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Výstup

Před předáním dat do šablony funkcí. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Po předání dat do funkční šablony. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

V tomto programu se místo volání funkce předáním hodnoty vydá volání odkazem.

Swap()Šablona funkce má dva argumenty a swap je podle odkazu.

Šablony tříd

Stejně jako šablony funkcí, můžete také vytvořit šablony tříd pro operace obecných tříd.

Někdy potřebujete implementaci třídy, která je pro všechny třídy stejná, liší se pouze použité datové typy.

Normálně byste pro každý datový typ museli vytvořit jinou třídu NEBO vytvořit různé členské proměnné a funkce v rámci jedné třídy.

To zbytečně nafoukne vaši kódovou základnu a bude těžké ji udržovat, protože změna je jedna třída / funkce by měla být prováděna ve všech třídách / funkcích.

Šablony tříd však usnadňují opětovné použití stejného kódu pro všechny datové typy.

Jak deklarovat šablonu třídy?

 template < class T> class className (… public: T var; T someOperation (T arg);…);

Ve výše uvedené deklaraci Tje argument šablony, který je zástupným symbolem použitého datového typu.

Uvnitř těla třídy jsou členské proměnné var a členské funkce someOperation()typu T.

Jak vytvořit objekt šablony třídy?

Chcete-li vytvořit objekt šablony třídy, musíte při vytváření definovat datový typ uvnitř a .

 className classObject; 

Například:

 className classObject; className classObject; className classObject; 

Example 3: Simple calculator using Class template

Program to add, subtract, multiply and divide two numbers using class template

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Output

 Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1 & num2, and a constructor to initalize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Potom displayResult()se zavolá oba objekty, které provedou operace kalkulačky a zobrazí výstup.

Zajímavé články...