Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Introduction to Templatespecialisering | Templatespecialisering
C++-Mallar

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

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

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.

question mark

Varför ger funktionsmallen square i exemplet ett fel när std::string används?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 1

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 4. Kapitel 1
some-alt