C ++ -sjablonen

In dit artikel leert u over sjablonen in C ++. Je leert de kracht van sjablonen gebruiken voor generiek programmeren.

Sjablonen zijn krachtige functies van C ++ waarmee u algemene programma's kunt schrijven. In eenvoudige bewoordingen kunt u een enkele functie of een klasse maken om met verschillende gegevenstypen te werken met behulp van sjablonen.

Sjablonen worden vaak gebruikt in een grotere codebase met het oog op herbruikbaarheid van code en flexibiliteit van de programma's.

Het concept van sjablonen kan op twee verschillende manieren worden gebruikt:

  • Functiesjablonen
  • Klasse-sjablonen

Functiesjablonen

Een functiesjabloon werkt op dezelfde manier als een normale functie, met één belangrijk verschil.

Een enkele functiesjabloon kan met verschillende gegevenstypen tegelijk werken, maar een enkele normale functie kan slechts met één set gegevenstypen werken.

Normaal gesproken, als u identieke bewerkingen op twee of meer soorten gegevens moet uitvoeren, gebruikt u functie-overbelasting om twee functies te creëren met de vereiste functiedeclaratie.

Een betere benadering zou echter zijn om functiesjablonen te gebruiken, omdat u dezelfde taak kunt uitvoeren door minder en onderhoudbare code te schrijven.

Hoe een functiesjabloon declareren?

Een functie template begint met het trefwoord matrijs vervolgens binnen sjabloonparameter / s dat wordt gevolgd door functiedeclaratie.

 sjabloon < klasse T> T eenFunctie (T arg) (…)

In de bovenstaande code is T een sjabloonargument dat verschillende gegevenstypen accepteert (int, float), en class is een trefwoord.

U kunt typenamein het bovenstaande voorbeeld ook trefwoord gebruiken in plaats van klasse.

Wanneer een argument van een gegevenstype wordt doorgegeven someFunction( ), genereert de compiler een nieuwe versie van someFunction()voor het gegeven gegevenstype.

Voorbeeld 1: functiesjabloon om het grootste aantal te vinden

Programmeer om de grootste van twee getallen weer te geven met behulp van functiesjablonen.

 // 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; )

Uitvoer

Voer twee gehele getallen in: 5 10 10 is groter. Voer twee drijvende-kommagetallen in: 12,4 10,2 12,4 is groter. Voer twee tekens in: z Z z heeft een grotere ASCII-waarde.

In het bovenstaande programma is een functiesjabloon Large()gedefinieerd die twee argumenten n1 en n2 van het gegevenstype accepteert T. Tgeeft aan dat het argument van elk gegevenstype kan zijn.

Large() functie retourneert de grootste van de twee argumenten met behulp van een eenvoudige voorwaardelijke bewerking.

Binnen de main()functie, variabelen van drie verschillende soorten gegevens: int, floaten charworden gedeclareerd. De variabelen worden vervolgens Large()als normale functies aan de functiesjabloon doorgegeven .

Tijdens runtime, wanneer een geheel getal wordt doorgegeven aan de sjabloonfunctie, weet de compiler dat het een Large()functie moet genereren om de int-argumenten te accepteren en doet dit.

Evenzo, wanneer drijvende-kommagegevens en char-gegevens worden doorgegeven, kent het de argumentgegevenstypen en genereert het de Large()functie dienovereenkomstig.

Op deze manier verving het gebruik van slechts één functiesjabloon drie identieke normale functies en maakte uw code onderhoudbaar.

Voorbeeld 2: gegevens uitwisselen met behulp van functiesjablonen

Programma om gegevens te wisselen met behulp van functiesjablonen.

 #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; ) 

Uitvoer

Voordat u gegevens doorgeeft aan functiesjabloon. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Na het doorgeven van gegevens aan functiesjabloon. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a

In dit programma wordt in plaats van een functie aan te roepen door een waarde door te geven, een aanroep door middel van verwijzing gegeven.

De Swap()functiesjabloon accepteert twee argumenten en verwisselt ze door middel van verwijzing.

Klasse-sjablonen

Net als functiesjablonen kunt u ook klassesjablonen maken voor algemene klassebewerkingen.

Soms heb je een klasse-implementatie nodig die voor alle klassen hetzelfde is, alleen de gebruikte gegevenstypen zijn verschillend.

Normaal gesproken zou u voor elk gegevenstype een andere klasse moeten maken OF verschillende lidvariabelen en functies binnen één klasse moeten maken.

Dit zal uw codebasis onnodig opzwellen en zal moeilijk te onderhouden zijn, aangezien een wijziging één klasse / functie is die moet worden uitgevoerd op alle klassen / functies.

Klassensjablonen maken het echter gemakkelijk om dezelfde code opnieuw te gebruiken voor alle gegevenstypen.

Hoe een klassensjabloon declareren?

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

In de bovenstaande verklaring Tis het sjabloonargument dat een tijdelijke aanduiding is voor het gebruikte gegevenstype.

Binnen de hoofdtekst van de klasse zijn een lidvariabele var en een lidfunctie someOperation()beide van het type T.

Hoe maak ik een klassesjabloonobject aan?

Om een ​​klassesjabloonobject te maken, moet u het gegevenstype binnen a definiëren bij het maken.

 className classObject; 

Bijvoorbeeld:

className classObject; className classObject; className classObject;

Voorbeeld 3: eenvoudige rekenmachine met Class-sjabloon

Programma om twee getallen op te tellen, af te trekken, te vermenigvuldigen en te delen met behulp van een klassensjabloon

 #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; ) 

Uitvoer

Int resultaten: Getallen zijn: 2 en 1. Optellen is: 3 Aftrekken is: 1 Product is: 2 Divisie is: 2 Float resultaten: Getallen zijn: 2.4 en 1.2. Optellen is: 3,6 Aftrekken is: 1,2 Product is: 2,88 Divisie is: 2

In het bovenstaande programma wordt een klassensjabloon Calculatorgedeclareerd.

De klasse bevat twee Tprivéleden van het type : num1 & num2, en een constructor om de leden te initialiseren.

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.

Vervolgens wordt displayResult()van beide objecten aangeroepen die de rekenmachine-bewerkingen uitvoeren en de uitvoer weergeven.

Interessante artikelen...