Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Luokkamallin Argumenttien Päättely | Luokkamallipohjat
C++-Template-Luokat

Luokkamallin Argumenttien Päättely

Pyyhkäise näyttääksesi valikon

Olet saattanut jo käyttää joitakin niistä huomaamattasi, että ne olivat alun perin malleja, mahdollisesti Class Template Argument Deductionin (CTAD) ansiosta.

C++17-versiosta alkaen voimme hyödyntää Class Template Argument Deductionia (CTAD). Tämän ominaisuuden avulla voimme luoda malliluokkien olioita ilman, että meidän tarvitsee erikseen määrittää mallin tyyppejä. Kääntäjä päättelee tyypit konstruktorin parametrien perusteella. Tarkastellaan esimerkkejä käyttäen std::pair-luokkaa.

main.cpp

main.cpp

12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<int, char> my_pair(1, 'a'); std::cout << my_pair.first << " : " << my_pair.second << std::endl; }
Note
Huomio

Aiemmin tämä oli ainoa tapa luoda std::pair-olio. Nyt on kuitenkin mahdollista jättää pois <int, char>-osa. Kokeile poistaa se ja suorita koodi uudelleen.

Luokkatemplaatin argumenttien päättely suoritetaan vain, jos templaattiargumenttilistaa ei ole annettu. Jos templaattiargumenttilista on määritelty, päättelyä ei tapahdu.

main.cpp

main.cpp

12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<> my_pair(1, 'a'); // Error std::cout << my_pair.first << " : " << my_pair.second << std::endl; }

Kun luodaan olio yhdellä argumentilla, joka vastaa tiettyä luokkatemplaatin tyyppiä, CTAD suosii tämän tyypin suoraa käyttöä, mikä yksinkertaistaa käyttäjän määrittelemien templaattien olioiden luontia. Esimerkiksi templaattiluokan, kuten Box, tapauksessa käyttäjä voi luoda olion ilman tyyppiparametrien määrittelyä, kun konstruktorille annetaan argumentit.

main.cpp

main.cpp

123456789101112131415
#include <iostream> template <typename T> class Box { T value; public: Box(T value): value(value) {} }; int main() { // No need to write Box<int> a{1}; Box a{1}; // Deduction: Box<int> Box b{a}; // Deduction: Box<int>, not Box<Box<int>> }

CTAD helpottaa koodin ylläpitoa. Jos taustalla olevat tyypit muuttuvat, päivitettävää koodia on vähemmän, mikä vähentää virheiden mahdollisuutta.

vector.h

vector.h

12345678
template <typename T> class Vector3D { T x, y, z; public: Vector3D(T x, T y, T z) : x(x), y(y), z(z) {} }; Vector3D vec{1.0, 2.0, 3.0}; // CTAD deduces Vector3D<double>

Kun käytetään säiliöitä tai kääreitä, joilla on erityisiä konstruktoreita, CTAD voi yksinkertaistaa koodia. Oletetaan, että sinulla on oma Matrix- tai Vector-luokka, joka käärii jonkin tietotyypin. CTAD:n käyttö tässä voi auttaa varmistamaan, että tyyppipäättely tapahtuu automaattisesti annettujen argumenttien perusteella, mikä parantaa luettavuutta ja joustavuutta.

question mark

Mitä tarkoittaa Class Template Argument Deduction (CTAD)?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 3. Luku 4
some-alt