Introduktion til templatespecialisering
Stryg for at vise menuen
En generel skabelon fungerer for enhver datatype. Visse typer kan dog kræve særlig behandling. For eksempel, hvis du implementerer en funktion, der opfører sig forskelligt for int og std::string typer, giver skabelonspecialisering dig mulighed for at definere en anden version af skabelonen for hver type.
main.cpp
123456789101112#include <iostream> template<typename T> T square(T value) { return value * value; } int main() { std::cout << square<int>(25); std::cout << square<std::string>("5"); }
Hvis du kører koden ovenfor, vil du støde på en fejl. Dette sker, fordi std::string ikke understøtter *-operatoren. Derfor er det nødvendigt at informere compileren om, hvordan en std::string, der gives som parameter, skal håndteres.
Hvordan skabeloner fungerer under motorhjelmen
Lige nu får du kun fat i det grundlæggende om skabeloner, specifikt funktionsskabeloner. Du har lært, hvordan man opretter dem, bruger parameterlister og kalder funktionerne med forskellige datatyper. Du undrer dig måske over, hvorfor vi i dette tilfælde ikke bare overbelaster funktioner for alle tilgængelige numeriske typer i C++. Selvom denne tilgang kunne fungere for dette eksempel, er det vigtigt at huske, at skabeloner er et langt mere kraftfuldt værktøj.
main.cpp
12345678910111213#include <iostream> struct myStruct {}; class myClass {}; template<typename T> void TemplateFunction() { std::cout << typeid(T).name() << std::endl; } int main() { TemplateFunction<myClass>(); TemplateFunction<myStruct>(); }
Skabeloner kan acceptere enhver datatype, inklusive brugerdefinerede typer. Til sammenligning ville det udelukkende at stole på funktionsoverbelastning kræve, at man opretter en ny funktion for hver type, hvilket gør opdateringer besværlige og fejlbehæftede. Derfor kan vi ikke nøjes med funktionsoverbelastning alene og må bruge skabelonspecialiseringer for at håndtere problemer som dem i square-skabelonfunktionen.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat