Funktio- ja luokkamallit uudelleen tarkasteltuna
Kirjoita geneerisiä funktioita ja luokkia oikeaoppisella mallisyntaksilla.
Funktio- ja luokkamallit uudelleen tarkasteltuna on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.
Miksi templatet?
Templatien avulla voitte kirjoittaa koodin kerran, jolloin kääntäjä muodostaa käytetylle tyypille sopivan version. Tämä on geneerisen ohjelmoinnin kulmakivi.
Funktiotemplaten syntaksi
Määritelkää tyyppiparametrit käyttämällä template <typename T> -rakennetta. Käyttäkää funktiosignatuurissa tyyppiä T.
template <typename T>
T max_of(T a, T b) {
return (a > b) ? a : b;
}
std::cout << max_of(3, 7); // int
std::cout << max_of(2.5, 1.5); // doubletypename vs class
Avainsanat typename ja class ovat keskenään vaihdettavia template-parametrien määrittelyissä. typename on yleisempi nykytyylissä.
Useita tyyppiparametreja
Templateilla voi olla useita tyyppiparametreja.
template <typename T, typename U>
auto combine(T a, U b) -> decltype(a + b) {
return a + b;
}Muut kuin tyyppiparametrit
Template-parametrit voivat olla myös muita kuin tyyppiarvoja, kuten kokonaislukuja, enumeraatioita ja osoittimia.
template <typename T, size_t N>
struct StaticArray {
T data[N];
};
StaticArray<int, 10> arr;Luokkatemplatet
Geneerisissä luokissa käytetään samaa template-syntaksia. Käyttäkää tyyppiparametria jäseniin ja metodeihin.
template <typename T>
class Stack {
std::vector<T> data_;
public:
void push(T x) { data_.push_back(std::move(x)); }
T pop() { T t = std::move(data_.back()); data_.pop_back(); return t; }
};
Stack<int> s1;
Stack<std::string> s2;Jäsenfunktiot luokan ulkopuolella
Luokan ulkopuolisissa määrittelyissä template-etuliite tarvitaan jokaisen jäsenen edelle.
template <typename T>
class Stack {
public:
void push(T x);
};
template <typename T>
void Stack<T>::push(T x) {
data_.push_back(std::move(x));
}Templaten oletusargumentit
Kuten funktioiden oletusargumentit. Niitä käytetään, kun kutsuja ei määritä argumenttia.
template <typename T = int>
class Box {
T value;
};
Box<> b; // T is intTemplate-argumenttien päättely
Kääntäjä päättelee usein template-argumentit kutsusta.
template <typename T>
void print(T x) { std::cout << x; }
print(42); // T deduced as int
print("hello"); // T deduced as const char*
print<double>(3); // explicitLuokkatemplaten argumenttien päättely (C++17)
C++17:n ansiosta luokkatemplaten argumentit voi jättää pois, kun ne voidaan päätellä konstruktorista.
std::pair p(1, 2.5); // pair<int, double>
std::vector v{1, 2, 3}; // vector<int>Kaksivaiheinen haku
Templatet käyvät nimenhaun läpi kahdessa vaiheessa — määrittelyvaiheessa (riippumattomat nimet) ja instansiointivaiheessa (riippuvaiset nimet). Näin monet virheet havaitaan jo määrittelyvaiheessa.
Virheilmoitukset
Template-virheet voivat vaikuttaa pelottavilta. Lukekaa ilmoitusta alhaalta ylöspäin, keskittykää lähdekoodin sijaintiin ja parantakaa diagnostiikkaa käyttämällä C++20-concepteja.
Pikatarkistus
Mikä ominaisuus mahdollistaa sen, että std::vector v{1, 2, 3}; kääntyy ilman, että std::vector<int> määritetään?
Kertaus
Templatet muodostavat tyyppikohtaista koodia käännösaikana. Määritelkää funktio- ja luokkatemplatet käyttämällä template <typename T> -rakennetta. Kääntäjä päättelee argumentit aina kun mahdollista — määritelkää ne tarvittaessa eksplisiittisesti.
Opi C++ tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”Funktio- ja luokkamallit uudelleen tarkasteltuna” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Funktio- ja luokkamallit uudelleen tarkasteltuna”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Funktio- ja luokkamallit uudelleen tarkasteltuna”?
Kirjoita geneerisiä funktioita ja luokkia oikeaoppisella mallisyntaksilla. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Funktio- ja luokkamallit uudelleen tarkasteltuna”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?
Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Funktio- ja luokkamallit uudelleen tarkasteltuna
- Mallien erikoistaminen: osittainen ja täydellinen
- Variadiset mallit ja parametripaketit
- constexpr-funktiot ja if constexpr