C ++ Kort samengevat sjablonen

Invoering

Sjabloonfuncties en klassen hebben een soortgelijk doel in C ++ als generieke functies in C #. Hiermee kunt u uw code opnieuw gebruiken zonder een functie of klasse te schrijven voor elke gewenste variant. Zolang de typen die u aan de sjabloon toevoegt, de functionaliteit hebben die aan de sjabloon is gekoppeld, is alles goed. Als dat niet het geval is, genereert de compiler een fout. Dit komt omdat de compiler een unieke klasse genereert voor elke specialisatie die u gebruikt. Omdat de compiler klassen en functies uit de sjablonen van uw programma samenstelt, moeten sjabloonfuncties en klassen in headerbestanden worden geplaatst en volledig inline worden gedefinieerd. Op die manier kan de compiler ze parseren voor alle broncodebestanden die ze gebruiken.

Uiteindelijk kunnen sjablonen erg complex worden. De C ++ Standard Library toont de kracht en complexiteit van geavanceerde sjablonen. Desondanks hebt u geen geavanceerde kennis van sjablonen nodig om deze effectief te gebruiken. Een goed begrip van de grondbeginselen van C ++ -sjablonen helpt u een aanzienlijke hoeveelheid functionaliteit en kracht te ontgrendelen.


Sjabloonfuncties

Een sjabloonfunctie is een zelfstandige functie die ten minste één sjabloonargument gebruikt. Het feit dat het een argument nodig heeft, maakt het onvolledig totdat het wordt geroepen met een concreet argument, waardoor het sjabloon een volledig gedefinieerde functie wordt. Hier is een sjabloonfunctie die twee argumenten opneemt.

Voorbeeld: TemplatesSample \ PeekLastItem.h

#pragma eenmaal sjabloon U PeekLastItem (T & collectie) return * collection.rbegin (); 

Het maken van een willekeurige sjabloonfunctie of klasse begint met de sleutelwoordensjabloon gevolgd door de parameters binnen de pijlhaken, zoals te zien in de vorige steekproef met klasse T en klasse U. Het gebruik van de woordklasse vóór T en U betekent niet die argumenten moeten klassen zijn. Zie de klasse in plaats daarvan als een algemeen woord dat bedoeld is om de betekenis van een niet-specifiek type over te brengen. U kunt een sjabloon hebben met betonsoorten of met een combinatie van niet-specifieke klassetypen en betonsoorten, zoals sjabloon. Het gebruik van T als de naam voor het eerste argument en U voor een seconde is een gangbare praktijk, geen vereiste. Je zou bijna alles kunnen gebruiken als een template-argumentnaam.

De vorige functie neemt een verwijzing op naar een item van type T. Het veronderstelt dat T een led-functie zal hebben genaamd rbegin, die kan worden aangeroepen zonder argumenten en een aanwijzertype retourneert dat, wanneer wordt verwezen, een object van het type U wordt. Deze specifieke functie is voornamelijk ontworpen om te werken met veel van de collectieklassen van de C ++ Standard Library, hoewel elke klasse die voldoet aan de veronderstellingen die de functie maakt over type T kan worden gebruikt met deze sjabloonfunctie. Dat vermogen om elk type te nemen, de vereiste functionaliteit eraan toe te voegen en daardoor in aanmerking te laten komen voor gebruik met een sjabloon, is de belangrijkste trek van sjablonen..


Sjabloonklassen

Sjabloonklassen zijn vergelijkbaar met sjabloonfuncties, maar het zijn klassen in plaats van eenvoudige, op zichzelf staande functies. Laten we een voorbeeld bekijken.

Voorbeeld: TemplatesSample \ SimpleMath.h

#pragma eenmaal sjabloon class SimpleMath public: SimpleMath (void)  ​​~ SimpleMath (void)  ​​T Add (T a, T b) return a + b;  T Aftrekken (T a, T b) retourneer a - b;  T Multiply (T a, T b) return a * b;  T Divide (T a, T b) return a / b; ;

Zoals de naam al aangeeft, is deze klasse niet meer dan een demonstratie. Er is slechts één typeargument. Als we naar de klassendefinitie kijken, kunnen we afleiden dat de vereisten voor T in dit geval zijn dat deze de volgende operatoren heeft, die allemaal werken op twee exemplaren van T en een exemplaar van T retourneren:

  • +
  • -
  • *
  • /

Hoewel deze logisch bij getallen horen, kunt u deze operators definiëren voor elke klasse of gegevenstype en vervolgens een instantie van deze sjabloonklasse instantiëren, die is gespecialiseerd voor uw aangepaste klasse (bijvoorbeeld een Matrix-klasse).

Nog een laatste opmerking: als je de lidfuncties buiten de klassendefinitie zou definiëren, maar nog steeds in hetzelfde headerbestand, dan zou je het inline sleutelwoord in de verklaringen moeten gebruiken; de definities zouden er als volgt uitzien: SimpleMath :: SimpleMath (void) .

Dit is het laatste bestand van dit voorbeeld, dat een eenvoudig gebruik van elk van de voorgaande sjablonen laat zien.

Voorbeeld: TemplatesSample \ TemplatesSample.cpp

#include  #include  #include  # include "SimpleMath.h" # include "PeekLastItem.h" # include "... /pchar.h" met behulp van namespace std; int _pmain (int / * argc * /, _pchar * / * argv * / []) SimpleMath smf; wcout << "1.1F + 2.02F = " << smf.Add(1.1F, 2.02F) << "F." << endl; vector VAK; strs.push_back (L "Hello"); strs.push_back (L "World"); wcout << L"Last word was '" << PeekLastItem,const wchar_t *> (strs) << L"'." << endl; return 0; 

Conclusie

Sjabloonfuncties helpen u code opnieuw te gebruiken, waardoor uw codebasis eenvoudiger te beheren en te DROGEN is (Do not Repeat Yourself). Lambda-expressies zijn het onderwerp van het volgende artikel van deze serie.

Deze les staat voor een hoofdstuk uit C ++ Kort gezegd, een gratis eBoek van het team van Syncfusion.