ПредишенСледващото

Въведение в магията на модели -3

  • 06.22.15 03:59 •
  • Ferus •
  • • # 260899
  • • Habrahabr
  • 11 •
  • 4897

- като Forbes, само по-добре.

Шаблоните в C ++ са мета-програмиране средства и да осъзнаят, по време на компилиране полиморфизъм. Какво е това?
Това е, когато пишете код с полиморфна поведение, но самото поведение се определя по време на компилация - т.е. за разлика от виртуалната функция полиморфизъм, което води до двоичен вече ще има постоянно поведение.



Ние използваме шаблони за красота. Всеки C ++ програмист знае какво е красота, красота - това е, когато компактен код. интуитивно и бързо.

Мета-магически и косвени интерфейси


Какво е metoprogramma? Metoprogramma - програма, в резултат на което ще бъде различна програма. C ++ изпълнение на мета-програми, съставител и резултатът е двоичен файл.

Първите заклинания магия сопа


Въведение в магията на модели

Конкретизираме нашия шаблон и да видим какви сме получили за различни параметри на шаблона:


Това се вижда в изхода на програмата, кои видове шаблони инстанцирания различни, дори и за еквивалентни видове - грозен Чар Чар. В този случай, те са идентични с въглен ЧАР, защото typedef не създава вид, а просто го дава друго име. Те са идентични за изразяване 1 и 2-1, като съставител оценява изрази и вместо това използват едно 2-1.

Това означава, че не можем да използваме за разделно събиране на образци, без допълнителни проблеми:


Като цяло, стандартната C ++ за това е износът на ключови думи. Въпреки това, тази функция е твърде трудно да се изпълни и отсъства в повечето компилатори. Има компилатори, които го поддържат, но аз ви съветвам да не го използва в преносим код.

В допълнение, има класове и функционални шаблони:

Ако компилаторът може да се направи извод от типа на параметъра шаблон на параметрите тип - той ще направи това, по този начин ние не трябва да го посочите в код. Ако не, тогава можем да определим функцията на резолюцията:


Тя не носи каквато и режийни.

Специализация - ново ниво


Въведение в магията на модели

Обикновено, като се използват шаблони, които искаме да пишат общ код, но в някои случаи може да загубят ефективността. За да се реши този проблем има специална магия - шаблон специализация. Специализация - този модел повторно определение със специфичен тип или типове клас:


Компилаторът ще избере най-подходящата специализация именно в примера е тип клас "указател към тип".

Sinister магия: рекурсия


Специализация и на факта, че ние можем да използваме шаблони в шаблоните, дава много интересна възможност на дамите - рекурсивно по време на компилацията.

Въведение в магията на модели

Най-лесният и най-често срещаният пример - изчисляването на серия или полином, например, сумата от серия от естествени числа:


Вижте ... Тя работи! Cool? Увеличаване на броя на повторения до 500:


Сега компилация отнема повече време, времето за програма - постоянно! Чудесата!

Не правете като козле, ако бурята


Има няколко минути.

Въведение в магията на модели

Максималната дълбочина на рекурсия е ограничен до изпълнението по подразбиране за нови ССЗ е 900, за по-старите версии на това по-малко. параметър

премахва това ограничение.

Вторият протест - не чакайте за отчитането на грешки. Промяна на размера на факториел:


Ние получат неверни резултати и без предупреждение.

Третата точка е очевидна: да можем да създадем много почти същия шаблон инстанциирането и вместо да получи изпълнение засили двоични печалби.

Мощни магии древна


Възможно ли е да се съчетаят магията на наследяване с магията на шаблон?

Въведение в магията на модели

Древният използването на тази магия CRTP. Идеята е проста: да не се използва виртуална наследство и да осигури полиморфна поведение чрез изрично вид наследник на типа родител. Нека разгледаме един пример за използване:


Ние се наследява методи вградени с полиморфна поведение! Кой ще каже, че не е готино - мой враг завинаги.

Древните са също препоръчва да се добавя към основния конструктор нещо подобно:


За да демони, събудени от мощен заклинание, не може да вреди, причинени от тяхната маг.

Въведение в магията на модели

Има много тайни техники, древни и не много. Надявам се да не се видим скоро / * ада * /, и да ще пристигне с вас силата на древните.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!