templates c with examples
Leer de verschillende aspecten van sjablonen in C ++.
Sjablonen zijn een van de krachtigste functies in C ++. Sjablonen geven ons de code die onafhankelijk is van het gegevenstype.
Met andere woorden, met behulp van sjablonen kunnen we een generieke code schrijven die op elk gegevenstype werkt. We hoeven alleen het datatype als parameter door te geven. Deze parameter die het gegevenstype doorgeeft, wordt ook wel een typenaam genoemd.
In deze tutorial zullen we alles over sjablonen en de verschillende aspecten ervan in detail onderzoeken.
Klik hier voor de Absolute C ++ trainingsserie.
Wat je leert:
- Wat zijn sjablonen?
- Hoe sjablonen / implementatie te gebruiken?
- typenaam Vs. class trefwoord
- Sjabloon instantiatie en specialisatie
- Template specialisatie
- C ++ Variadic-sjablonen
- Gevolgtrekking
- Aanbevolen literatuur
Wat zijn sjablonen?
Zoals hierboven vermeld, zijn sjablonen generiek, d.w.z. onafhankelijk van het gegevenstype. Sjablonen worden voornamelijk gebruikt om de herbruikbaarheid van code en de flexibiliteit van de programma's te waarborgen. We kunnen gewoon een eenvoudige functie of een klasse maken die het gegevenstype als parameter gebruikt en de code implementeren die voor elk gegevenstype werkt.
Bijvoorbeeld, als we willen dat een sorteeralgoritme werkt voor alle numerieke gegevenstypen en voor tekenreeksen, dan zullen we gewoon een functie schrijven die het gegevenstype als argument aanneemt en de sorteertechniek implementeren.
Afhankelijk van het gegevenstype (typenaam) dat wordt doorgegeven aan het sorteeralgoritme, kunnen we de gegevens sorteren, ongeacht het gegevenstype. Op deze manier hoeven we geen tien algoritmen te schrijven voor tien datatypes.
Sjablonen kunnen dus worden gebruikt in toepassingen waarin we vereisen dat de code bruikbaar is voor meer dan één gegevenstype. Sjablonen worden ook gebruikt in toepassingen waar herbruikbaarheid van code van het grootste belang is.
Hoe sjablonen / implementatie te gebruiken?
Sjablonen kunnen op twee manieren worden geïmplementeerd:
- Als een functiesjabloon
- Als klassensjabloon
Functiesjabloon
Functiesjabloon is net als een normale functie, maar het enige verschil is dat de normale functie alleen op één gegevenstype kan werken en een functiesjablooncode op meerdere gegevenstypen kan werken.
Hoewel we in feite een normale functie kunnen overbelasten om aan verschillende gegevenstypen te werken, zijn functiesjablonen altijd nuttiger omdat we het enige programma moeten schrijven en het kan werken met alle gegevenstypen.
Vervolgens zullen we de implementatie van functiesjablonen zien.
De algemene syntaxis van de functiesjabloon is:
Hier is T het sjabloonargument dat verschillende gegevenstypen accepteert en klasse is een trefwoord. In plaats van de trefwoordklasse kunnen we ook ‘typenaam’ schrijven.
Wanneer een bepaald gegevenstype wordt doorgegeven aan functienaam, wordt een kopie van deze functie gemaakt door de compiler met dit gegevenstype als argument en wordt de functie uitgevoerd.
Laten we een voorbeeld bekijken om functiesjablonen beter te begrijpen.
Uitgang:
Oorspronkelijke gegevens
num1 = 10 num2 = 20
d1 = 100,53 d2 = 435,54
ch1 = EEN ch2 = Z
Gegevens na omwisseling
num1 = 20 num2 = 10
d1 = 435,54 d2 = 100,53
ch1 = Z ch2 = EEN
rustgevende webservices interviewvragen en antwoorden voor ervaren in java
In het bovenstaande programma hebben we een functiesjabloon “func_swap” gedefinieerd die twee waarden uitwisselt. De functie heeft twee referentieargumenten van het type T. Het verwisselt vervolgens de waarden. Aangezien de argumenten verwijzingen zijn, worden alle wijzigingen die we aanbrengen in argumenten in de functie weerspiegeld in de aanroepfunctie.
In de hoofdfunctie definiëren we gegevens van het type int, double en char. We noemen functie func_swap met elk type data. Vervolgens geven we de verwisselde gegevens voor elk gegevenstype weer.
Dit toont dus aan dat we niet drie functies hoeven te schrijven voor drie datatypes. Het volstaat om slechts één functie te schrijven en maakt er een sjabloonfunctie van, zodat deze onafhankelijk is van het datatype.
Klasse-sjablonen
Net als bij functiesjablonen, kunnen we een vereiste hebben om een klasse te hebben die vergelijkbaar is met alle andere aspecten, maar alleen met verschillende gegevenstypen.
In deze situatie kunnen we verschillende klassen hebben voor verschillende gegevenstypen of verschillende implementaties voor verschillende gegevenstypen in dezelfde klasse. Maar als je dit doet, wordt onze code omvangrijk.
De beste oplossing hiervoor is om een templateklasse te gebruiken. Sjabloonklasse gedraagt zich ook vergelijkbaar met functiesjablonen. We moeten het gegevenstype als parameter aan de klasse doorgeven terwijl we objecten maken of lidfuncties aanroepen.
De algemene syntaxis voor de klassensjabloon is:
In de bovenstaande definitie fungeert T als een tijdelijke aanduiding voor het gegevenstype. De memVar en memFunction van de openbare leden gebruiken T ook als tijdelijke aanduiding voor gegevenstypen.
Zodra een sjabloonklasse is gedefinieerd zoals hierboven, kunnen we als volgt klasseobjecten maken:
Laten we een codevoorbeeld implementeren om klassesjablonen te demonstreren:
Uitgang:
Maximaal 100 en 75 = 100
Maximaal ‘A’ en ‘a’ = a
Het bovenstaande programma implementeert een voorbeeld van een klassensjabloon. We hebben de sjabloonklasse myclass. Hierbinnen hebben we een constructor die de twee leden a en b van de klasse zal initialiseren. Er is nog een lidfunctie getMaxval die ook een functiesjabloon is die maximaal a en b retourneert.
In de hoofdfunctie construeren we twee objecten, myobject van het type integer en mychobject van het type character. Vervolgens noemen we de functie getMaxval voor elk van deze objecten om de maximale waarde te bepalen.
Merk op dat naast templatetypeparameters (parameters van het type T), templatefuncties ook gewone parameters kunnen hebben zoals normale functies en ook standaardparameterwaarden.
typenaam Vs. class trefwoord
Bij het declareren van sjabloonklasse of functie gebruiken we een van de twee sleutelwoorden klasse of typenaam. Deze twee woorden zijn semantisch equivalent en kunnen door elkaar worden gebruikt.
Maar in sommige gevallen kunnen we deze woorden niet als equivalent gebruiken. Bijvoorbeeld, wanneer we afhankelijke datatypes gebruiken in sjablonen zoals “typedef”, gebruiken we typenaam in plaats van klasse.
Ook moet het class-sleutelwoord worden gebruikt als we een sjabloon expliciet moeten instantiëren.
Sjabloon instantiatie en specialisatie
De sjablonen zijn op een algemene manier geschreven, wat betekent dat het een algemene implementatie is, ongeacht het gegevenstype. Volgens het opgegeven gegevenstype moeten we voor elk gegevenstype een concrete klasse genereren.
Bijvoorbeeld, als we een sjabloonsorteeralgoritme hebben, kunnen we een concrete klasse genereren voor sorteren, een andere klasse voor sorteren, enz. Dit wordt instantiatie van de sjabloon genoemd.
We vervangen de sjabloonargumenten (werkelijke gegevenstypen) voor de sjabloonparameters in de definitie van de sjabloonklasse.
Bijvoorbeeld,
Wanneer we het gegevenstype doorgeven, vervangt de compiler het gegevenstype voor ‘T’ zodat het sorteeralgoritme sort wordt.
ascii naar int c ++
Elke keer dat we een sjabloonklasse of -functie gebruiken, is er behoefte aan een instantie wanneer we een bepaald gegevenstype doorgeven. Als deze instantie nog niet aanwezig is, maakt de compiler er een aan met het specifieke gegevenstype. Dit is de impliciete instantiatie.
Een nadeel van impliciete instantiatie is dat de compiler alleen de instantieklasse genereert voor de argumenten die momenteel worden gebruikt. Dit betekent dat als we een bibliotheek met instanties willen genereren voordat deze instanties worden gebruikt, we voor expliciete instantiatie moeten gaan.
Hieronder vindt u een voorbeeld van een sjabloonverklaring:
Kan expliciet worden geïnstantieerd als:
Wanneer een klasse wordt geïnstantieerd, worden ook al zijn leden geïnstantieerd.
Template specialisatie
Tijdens het programmeren met behulp van sjablonen, kunnen we geconfronteerd worden met een situatie waarin we mogelijk een speciale implementatie voor een bepaald gegevenstype nodig hebben. Wanneer zo'n situatie zich voordoet, gaan we voor sjabloospecialisatie.
Bij sjabloonspecialisatie implementeren we een speciaal gedrag voor een bepaald gegevenstype, afgezien van de oorspronkelijke sjabloondefinitie voor de andere gegevenstypen.
Bijvoorbeeld, bedenk dat we een sjabloonklasse hebben ‘ mijnIncrement ' die een constructor heeft om een waarde en een sjabloonfunctie te initialiseren toIncrement dat verhoogt de waarde met 1.
Deze specifieke klasse werkt perfect voor alle gegevenstypen behalve char. In plaats van de waarde voor char te verhogen, waarom zou u het dan niet een speciaal gedrag geven en het karakter in plaats daarvan naar hoofdletters converteren?
Om dit te doen, kunnen we gaan voor sjabloonspecialisatie voor het char-datatype.
Deze implementatie wordt getoond in het onderstaande codevoorbeeld.
Uitgang:
Verhoogde int-waarde: 8
Hoofdletterwaarde: S.
Verhoogde dubbele waarde: 12
In het bovenstaande programma dat sjabloonspecialisatie demonstreert, zie de manier waarop we een gespecialiseerd sjabloon voor char-type hebben gedeclareerd. We declareren eerst de originele klasse en vervolgens “specialiseren” we deze op char-type. Om met specialisatie te beginnen, gebruiken we een lege sjabloonverklaring 'sjabloon'.
Vervolgens nemen we na de klassenaam het gegevenstype op. Na deze twee wijzigingen wordt de klasse geschreven voor het char-type.
Merk in de hoofdfunctie op dat er geen verschil is tussen instantiatie van char-type en andere typen. Het enige verschil is dat we de gespecialiseerde klasse opnieuw definiëren.
Merk op dat we alle leden van de gespecialiseerde klasse moeten definiëren, ook al zijn ze precies hetzelfde in de generieke / originele sjabloonklasse. Dit komt omdat we geen overervingsfunctie hebben voor leden van de algemene sjabloon naar de gespecialiseerde sjabloon.
C ++ Variadic-sjablonen
Tot nu toe hebben we functiesjablonen gezien die een vast aantal argumenten hebben. Er zijn ook sjablonen die een variabel aantal argumenten hebben. Deze functiesjablonen worden variadische sjablonen genoemd. Variadische sjablonen zijn een van de nieuwste functies van C ++ 11.
Variadische sjablonen hebben een variabel aantal argumenten die type-safe zijn en de argumenten worden tijdens het compileren opgelost.
Laten we een compleet programmeervoorbeeld nemen om dit te begrijpen.
Uitgang:
Som van lange getallen = 21
Som van strings = Hallo
Het screenshot voor hetzelfde wordt hieronder gegeven.
Het bovenstaande voorbeeld toont de variadische functie, 'sommatie'. Zoals hierboven getoond, hebben we eerst een basisfunctie nodig die het basisscenario implementeert. Vervolgens implementeren we de variadische functie bovenop deze functie.
In de variabele functie sommatie wordt “typenaam… args” genoemd sjabloon parameter pack terwijl 'Args… args' wordt genoemd functie parameter pack
Nadat we een functiesjabloon hebben geschreven die het basisgeval implementeert, schrijven we een variadische functie die het algemene geval implementeert. De variadische functie wordt op dezelfde manier geschreven als de recursie zoals weergegeven voor sommatie (args…). Het eerste argument wordt gescheiden van het functieparameterpakket in type T (eerste).
Bij elke aanroep tot sommatie wordt de parameterlijst met één argument smaller en wordt uiteindelijk de basisvoorwaarde bereikt. De uitvoer toont de sommatie voor lange gehele getallen en tekens.
Gevolgtrekking
Hiermee sluiten we deze tutorial over sjablonen in C ++ af. Sjablonen helpen ons om onze programma's generiek te maken, d.w.z. onafhankelijk van het type.
Lees ook = >> Flask Template Tutorial
Generieke programma's staan altijd bovenop de andere programma's omdat we geen aparte programma's hoeven te schrijven voor elk datatype. Het ontwikkelen van generieke typeveilige programma's kan dus een belangrijke stap zijn naar een efficiënte programmering.
Bekijk hier de diepgaande C ++ trainingshandleidingen.
Aanbevolen literatuur
- Python Main Function-zelfstudie met praktische voorbeelden
- Hoe datagestuurd testen werkt (voorbeelden van QTP en selenium)
- Multithreading in C ++ met voorbeelden
- Python DateTime-zelfstudie met voorbeelden
- Voorbeeldtestcase-sjabloon met voorbeelden van testcases (Download)
- Knip Commando in Unix met voorbeelden
- Voorbeeldsjabloon voor acceptatietestrapport met voorbeelden
- Unix Cat Command Syntax, opties met voorbeelden