Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Introduksjon til templatespesialisering | Templatespesialisering
C++-Maler

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

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

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.

question mark

Hvorfor gir funksjonstemplatet square i eksempelet en feil når std::string brukes?

Velg det helt riktige svaret

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 1

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 4. Kapittel 1
some-alt