Introduksjon til templatespesialisering
Sveip for å vise menyen
En generell mal fungerer for alle datatyper. Enkelte typer kan imidlertid kreve spesiell behandling. For eksempel, hvis du implementerer en funksjon som oppfører seg forskjellig for int og std::string, gir malspesialisering deg mulighet til å definere en egen versjon av malen 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 kjører koden over, vil du få en feil. Dette skjer fordi std::string ikke støtter *-operatoren. Derfor er det nødvendig å informere kompilatoren om hvordan en std::string skal håndteres som parameter.
Hvordan maler fungerer under panseret
Foreløpig lærer du bare det grunnleggende om maler, spesielt funksjonsmaler. Du har lært hvordan du lager dem, bruker parameterlister og kaller funksjonene med ulike datatyper. Du lurer kanskje på hvorfor vi i dette tilfellet ikke bare overbelaster funksjoner for alle tilgjengelige numeriske typer i C++. Selv om denne tilnærmingen kunne fungert for dette eksempelet, er det viktig å huske at maler er et langt kraftigere verktøy.
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>(); }
Maler kan akseptere alle datatyper, inkludert brukerdefinerte typer. I motsetning til dette ville det å kun stole på funksjonsoverlasting kreve at man lager en ny funksjon for hver type, noe som gjør oppdateringer tungvint og feilutsatt. Derfor kan vi ikke bare stole på funksjonsoverlasting alene, og må bruke malspesialiseringer for å løse problemer som de i square-mal-funksjonen.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår