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