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


Bevezetés a varázslatos minták

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


Bevezetés a varázslatos minták

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.

Bevezetés a varázslatos minták

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.

Bevezetés a varázslatos minták

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?

Bevezetés a varázslatos minták

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.

Bevezetés a varázslatos minták

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.

Kapcsolódó cikkek