Mixin-luokat CRTP:llä
Koosta toiminnallisuutta käännösaikana
Mixin-luokat CRTP:llä on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.
Mikä mixin on?
mixin on pieni uudelleenkäytettävä toiminnallisuuden yksikkö, jonka koostatte luokkaan. CRTP:n avulla mixinit lisäävät toiminnallisuutta käännösaikana ja kutsuvat silti isäntäluokkaa.
Yksinkertainen mixin
Tämä mixin lisää print_twice-metodin, joka edellyttää, että isäntäluokka tarjoaa value()-metodin.
#include <iostream>
template <typename T>
struct PrintTwice {
void print_twice() const {
auto v = static_cast<const T*>(this)->value();
std::cout << v << " " << v << "\n";
}
};
struct Box : PrintTwice<Box> {
int value() const { return 7; }
};
int main() {
Box{}.print_twice();
return 0;
}Useiden mixinien koostaminen
Voitte periä useita CRTP-mixinejä samanaikaisesti ja koota toisistaan riippumattomia toimintoja yhteen luokkaan.
#include <iostream>
template <typename T>
struct Loggable {
void log() const { std::cout << "log: " << static_cast<const T*>(this)->id() << "\n"; }
};
template <typename T>
struct Resettable {
void reset() { static_cast<T*>(this)->set(0); }
};
struct Device : Loggable<Device>, Resettable<Device> {
int v = 5;
int id() const { return v; }
void set(int x) { v = x; }
};
int main() {
Device d;
d.log();
d.reset();
d.log();
return 0;
}Mixinit lisäävät myös tilaa
Mixin voi sisältää omia datakenttiään, joista tulee osa koostetun olion muistiasettelua.
#include <iostream>
template <typename T>
struct Tagged {
int tag = 0;
void set_tag(int t) { tag = t; }
int get_tag() const { return tag; }
};
struct Item : Tagged<Item> {
const char* name = "item";
};
int main() {
Item it;
it.set_tag(42);
std::cout << it.name << " " << it.get_tag() << "\n";
return 0;
}Mixin verrattuna tavalliseen perintään
CRTP-mixin eroaa tavallisesta perinnästä, koska kantaluokka voi kutsua alaspäin johdettua luokkaa. Tavalliset kantaluokat eivät voi kutsua metodeja, jotka ovat olemassa vain johdetussa tyypissä, ilman virtuaalifunktioita.
Policy-pohjainen suunnittelu
Mixinit mahdollistavat policy-pohjaisen suunnittelun: toiminnot valitaan käännösaikana päättämällä, mistä mixineistä peritään, samalla tavalla kuin std::vector ottaa vastaan allokaattoripolicyn.
Järjestys ja muistiasettelu
Kun mixinejä pinotaan, kantojen järjestys vaikuttaa rakennusjärjestykseen ja olion muistiasetteluun. Pitäkää mixinit toisistaan riippumattomina, jotta järjestyksellä ei ole vaikutusta oikeellisuuteen.
- Rakentaminen tapahtuu kantojen ilmoitusjärjestyksessä
- Välttäkää toistensa varaan rakentuvia mixinejä
Yhtäsuuruusmixin lisääminen
Tässä mixin muodostaa operator!=-operaattorin isäntäluokan yhtäsuuruusoperaation perusteella.
#include <iostream>
template <typename T>
struct EqualityMixin {
friend bool operator!=(const T& a, const T& b) { return !(a == b); }
};
struct P : EqualityMixin<P> {
int x;
P(int v) : x(v) {}
friend bool operator==(const P& a, const P& b) { return a.x == b.x; }
};
int main() {
std::cout << (P(1) != P(2)) << "\n";
return 0;
}Ehdolliset mixinit
Voitte sisällyttää mixinin vain ehdon täyttyessä yhdistämällä perinnän std::conditional-rakenteeseen ja valitsemalla joko varsinaisen mixinin tai tyhjän vaihtoehdon.
Empty Base Optimization
Datakenttiä sisältämättömät mixinit hyötyvät Empty Base Optimization-optimoinnista: kääntäjä ei varaa niille yhtään ylimääräistä tavua, joten useiden tilattomien mixinien pinoaminen ei maksa mitään koon kannalta.
#include <iostream>
template <typename T>
struct A {};
template <typename T>
struct B {};
struct C : A<C>, B<C> {
int x;
};
int main() {
std::cout << (sizeof(C) == sizeof(int)) << "\n";
return 0;
}Milloin mixinejä kannattaa käyttää
Mixinit ovat parhaimmillaan, kun monet luokat tarvitsevat samoja toisistaan riippumattomia toimintoja, kuten lokitusta, laskentaa tai vertailua. Ne pitävät kunkin toiminnon yhdessä paikassa ja mahdollistavat koostamisen ilman suoritusaikakustannuksia.
Pikatarkistus
Testatkaa, miten hyvin hallitsette CRTP-mixinit.
Kertaus
Opitte rakentamaan mixinejä CRTP:n avulla.
- Mixinit koostavat toisistaan riippumatonta toiminnallisuutta käännösaikana
- Ne voivat kutsua isäntäluokkaa ja sisältää tilaa
- Tilattomat mixinit eivät aiheuta lisäkustannuksia Empty Base Optimizationin ansiosta
- Ne sopivat erinomaisesti lokitus-, vertailu- ja laskentapolicyn toteuttamiseen
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 ”Mixin-luokat CRTP:llä” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Mixin-luokat CRTP:llä”. 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 ”Mixin-luokat CRTP:llä”?
Koosta toiminnallisuutta käännösaikana 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 3/4.
Kuinka kauan ”Mixin-luokat CRTP:llä”-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
- CRTP-idiomi
- Staattinen polymorfismi
- Mixin-luokat CRTP:llä
- Milloin CRTP:tä kannattaa käyttää