Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Introduction to Template Specialization | Template-erikoistelu
C++-Template-Luokat

Introduction to Template Specialization

Pyyhkäise näyttääksesi valikon

Yleinen malli toimii kaikille tietotyypeille. Tietyt tyypit saattavat kuitenkin vaatia erityiskäsittelyä. Esimerkiksi, jos toteutat funktion, joka käyttäytyy eri tavoin int- ja std::string-tyypeille, mallin erikoistaminen mahdollistaa eri version määrittämisen mallista jokaiselle tyypille.

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"); }

Jos suoritat yllä olevan koodin, kohtaat virheen. Tämä johtuu siitä, että std::string ei tue *-operaattoria. Siksi on tarpeen kertoa kääntäjälle, miten std::string-parametri käsitellään.

Miten mallit toimivat taustalla

Tällä hetkellä opit mallien perusteita, erityisesti funktiomalleja. Olet oppinut, kuinka niitä luodaan, käytetään parametrilistoja ja kutsutaan funktioita eri tietotyypeillä. Saatat miettiä, miksi tässä tapauksessa emme vain ylikuormittaisi funktioita kaikille C++:n numeerisille tyypeille. Vaikka tämä lähestymistapa voisi toimia tässä esimerkissä, on tärkeää muistaa, että mallit ovat huomattavasti tehokkaampi työkalu.

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>(); }

Mallit voivat hyväksyä minkä tahansa tietotyypin, mukaan lukien käyttäjän määrittelemät tyypit. Sen sijaan, että luotaisiin uusi funktio jokaiselle tyypille funktioiden ylikuormituksen avulla, päivityksistä tulisi työläitä ja virhe alttiita. Siksi emme voi luottaa pelkästään funktioiden ylikuormitukseen, vaan meidän on käytettävä mallien erikoistuksia ratkaistaksemme esimerkiksi square-mallifunktioon liittyvät ongelmat.

question mark

Miksi esimerkin square-funktiomalli aiheuttaa virheen, kun käytetään std::string-tyyppiä?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 1

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 4. Luku 1
some-alt