Introduction to Templatespecialisering
Svep för att visa menyn
En allmän mall fungerar för alla datatyper. Vissa typer kan dock kräva särskild behandling. Om du till exempel implementerar en funktion som beter sig olika för int och std::string-typer, möjliggör mall-specialisering att du kan definiera en annan version av mallen för varje typ.
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"); }
Om du kör koden ovan kommer du att stöta på ett fel. Detta sker eftersom std::string inte stöder *-operatorn. Därför är det nödvändigt att informera kompilatorn om hur en std::string som skickas som parameter ska hanteras.
Hur mallar fungerar under huven
Just nu bekantar du dig med grunderna i mallar, specifikt funktionsmallar. Du har lärt dig hur man skapar dem, använder parameterlistor och anropar funktionerna med olika datatyper. Du kanske undrar varför vi i detta fall inte bara överlagrar funktioner för alla tillgängliga numeriska typer i C++. Även om detta tillvägagångssätt skulle kunna fungera för det här exemplet är det viktigt att komma ihåg att mallar är ett mycket kraftfullare verktyg.
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>(); }
Mallar kan acceptera vilken datatyp som helst, inklusive användardefinierade typer. I kontrast skulle det, om man enbart förlitade sig på funktionsöverlagring, kräva att man skapar en ny funktion för varje typ, vilket gör uppdateringar besvärliga och felbenägna. Därför kan vi inte enbart förlita oss på funktionsöverlagring utan måste använda mall-specialiseringar för att hantera problem som de i square-mallfunktionen.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal