Bevezetés a varázslatos minták
Bevezetés a varázslatos minták -3
- 22.06.15 03:59 •
- Ferus •
- • # 260899
- • Habrahabr
- 11 •
- 4897
- mint a Forbes, csak jobb.
Sablonok C ++ meta-programozási eszközök és megvalósítani egy fordítási idejű polimorfizmus. Mi ez?
Ez az, amikor írunk kódot polimorf viselkedést, de a viselkedése maga határozza fordításkor - azaz szemben a virtuális függvény polimorfizmus kapott bináris lesz már állandó viselkedést.
Az általunk használt sablonok szépség. Minden C ++ fejlesztő tudja, mi a szépség, a szépség - az, amikor a kompakt kódot. intuitív és gyors.
Meta-mágia és implicit felületek
Mi metoprogramma? Metoprogramma - a program, melynek eredménye lesz egy másik programot. C ++ végrehajtása meta-programok, a fordító, és az eredmény egy bináris fájl.
Az első varázslatok mágikus husáng
Konkretizálják a sablont, és nézzük, milyen kaptunk különböző sablon paraméterei:
Ez látható a program kimenete, mely típusú sablon példányosítását különböző akár azonos típusú - unsigned char char. Ebben az esetben azok azonosak char CHAR, mert typedef nem hoz létre a típus, de csak ad neki egy másik nevet. Ezek azonosak a kifejezéseket az 1. és 2-1, a fordító kiértékeli kifejezést, és helyette egy január 02-01.
Ez azt jelenti, hogy nem tudjuk használni az elkülönített összeállításához sablonok további problémák:
Általában a szabványos C ++ erre a kulcsszó export. Azonban ez a funkció túl nehéz teljesíteni, és hiányzik a legtöbb fordító. Vannak fordítók, amelyek támogatják, de azt tanácsolom, hogy ne használja a hordozható kódot.
Ezen kívül vannak olyan osztályok és funkció sablonok:
Ha a fordító lehet következtetni, hogy milyen típusú a sablon típusú paramétert paraméterek - fogja megtenni, így nem kell, hogy adja meg azt a kódot. Ha nem, akkor meg tudjuk határozni a funkció a felbontás:
Nem vállal semmilyen fölött.
Szakterület - egy új szintre
Jellemzően a sablonok akarunk írni egy általános kódot, de bizonyos esetekben már romlik a teljesítménye. A probléma megoldására létezik egy speciális varázslat - template specializáció. Szakterület - ez újbóli meghatározását mintát egy speciális típusát vagy típusait osztály:
A fordító fogja kiválasztani a legmegfelelőbb szakosodás pontosan ebben a példában egy osztály típusú „mutató típus.”
Sinister magic: rekurzió
Szakterület és az a tény, hogy tudjuk használni a Sablonok ad a hölgyek egy nagyon érdekes lehetőség - rekurzív fordításkor.
A legegyszerűbb és leggyakoribb példa - a számítás egy sorozat vagy polinom, például, az összeget egy sor természetes számok:
Nézd ... Ez működik! Cool? Növekszik az iterációk számát 500:
Most összeállítása hosszabb időt vesz igénybe, a program ideje - folyamatos! Csodák!
Ne csináld, mint egy kecske, ha a vihar
Van egy pár pillanatig.
A maximális mélysége rekurzió korlátozódik alapértelmezett megvalósítása az új gcc 900, a régebbi kevésbé. paraméter
megszünteti ezt a korlátozást.
A második figyelmeztetés - nem várja meg a hibajelentést. Változás az összeget a faktoriális:
Kapjuk hibás eredményeket, és figyelmeztetés nélkül.
A harmadik pont egyértelmű: mi is létrehozhatunk túlságosan közel azonos sablont példányosítását és helyette kap a teljesítmény növelése bináris nyereséget.
Erőteljes varázslatok ősi
Lehetséges, hogy összekapcsolják a varázslatos öröklés a sablon mágia?
Az ősi felhasználása a varázslat CRTP. Az ötlet egyszerű: ne használja a virtuális öröklés, és polimorf viselkedése révén explicit típus örököse a szülő típus. Nézzünk egy példát a használatra:
Mi öröklődnek inline módszerek polimorf viselkedést! Ki fogja azt mondani, hogy ez nem jó - az ellenségem örökre.
A régiek is tanácsos hozzá kell adni a szülő konstruktor valami ilyesmi:
Ahhoz, hogy a démonok, ébredt egy nagy varázslat, nem általa okozott kárt a mágus.
Sok titkos technikák, ősi és nem túl sok. Remélem, hogy nem, hogy hamarosan találkozunk / * * pokol / és igen érkezik majd az erőt a régi.