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

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


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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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