C++ Academy · Oppitunti

Funktio- ja luokkamallit uudelleen tarkasteltuna

Kirjoita geneerisiä funktioita ja luokkia oikeaoppisella mallisyntaksilla.

Oppitunti 1/414 vaihetta

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);      // double

typename 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 int

Template-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);   // explicit

Luokkatemplaten 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.

Aloita maksutta

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

  1. Funktio- ja luokkamallit uudelleen tarkasteltuna
  2. Mallien erikoistaminen: osittainen ja täydellinen
  3. Variadiset mallit ja parametripaketit
  4. constexpr-funktiot ja if constexpr
← Takaisin: C++ Academy