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
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
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.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme