Шаблоните в C ++ са мета-програмиране средства и да осъзнаят, по време на компилиране полиморфизъм. Какво е това?
Това е, когато пишете код с полиморфна поведение, но самото поведение се определя по време на компилация - т.е. за разлика от виртуалната функция полиморфизъм, което води до двоичен вече ще има постоянно поведение.
Ние използваме шаблони за красота. Всеки C ++ програмист знае какво е красота, красота - това е, когато компактен код. интуитивно и бързо.
Мета-магически и косвени интерфейси
Първите заклинания магия сопа
Конкретизираме нашия шаблон и да видим какви сме получили за различни параметри на шаблона:
Това се вижда в изхода на програмата, кои видове шаблони инстанцирания различни, дори и за еквивалентни видове - грозен Чар # 038; Чар. В този случай, те са идентични с въглен # 038; ЧАР, защото typedef не създава вид, а просто го дава друго име. Те са идентични за изразяване 1 и 2-1, като съставител оценява изрази и вместо това използват едно 2-1.
Това означава, че не можем да използваме за разделно събиране на образци, без допълнителни проблеми:
Като цяло, стандартната C ++ за това е износът на ключови думи. Въпреки това, тази функция е твърде трудно да се изпълни и отсъства в повечето компилатори. Има компилатори, които го поддържат, но аз ви съветвам да не го използва в преносим код.
В допълнение, има класове и функционални шаблони:
Ако компилаторът може да се направи извод от типа на параметъра шаблон на параметрите тип - той ще направи това, по този начин ние не трябва да го посочите в код. Ако не, тогава можем да определим функцията на резолюцията:
Тя не носи каквато и режийни.
Специализация - ново ниво
Обикновено, като се използват шаблони, които искаме да пишат общ код, но в някои случаи може да загубят ефективността. За да се реши този проблем има специална магия - специализация Шалон. Специализация - този модел повторно определение със специфичен тип или типове клас.
Компилаторът ще избере най-подходящата специализация именно в примера е тип клас "указател към тип".
Sinister магия: рекурсия
Специализация и на факта, че ние можем да използваме шаблони в шаблоните, дава много интересна възможност на дамите - рекурсивно по време на компилацията.
Най-лесният и най-често срещаният пример - изчисляването на серия или полином, например, сумата от аритметична прогресия:
Вижте ... Тя работи! Cool? Увеличаване на броя на повторения до 500:
Сега компилация отнема повече време, времето за програма - постоянно! Чудесата!
Не правете като козле, ако бурята
Има няколко минути.
Максималната дълбочина на рекурсия е ограничен до изпълнението по подразбиране за нови ССЗ е 900, за по-старите версии на това по-малко. параметър
премахва това ограничение.
Вторият протест - не чакайте за отчитането на грешки. Промяна на прогресията на факториел:
Снабдете неправилни резултати и без предупреждение ...
Третата точка е очевидна: да можем да създадем много почти същия шаблон инстанциирането и вместо да получи изпълнение засили двоични печалби.
Мощни магии древна
Възможно ли е да се съчетаят магията на наследяване с магията на шаблон?
Древният използването на тази магия CRTP. Идеята е проста: да не се използва виртуална наследство и да осигури полиморфна поведение чрез изрично вид наследник на типа родител. Нека разгледаме един пример за използване.
Ние се наследява методи вградени с полиморфна поведение! Кой ще каже, че не е готино - мой враг завинаги.
Древните са също препоръчва да се добавя към основния конструктор нещо подобно:
за демони, събудени от мощен заклинание, не може да вреди, причинени от тяхната маг.
Има много тайни техники, древни и не много. Надявам се да не се видим скоро / * ада * /, и да ще пристигне с вас силата на древните.
Свързани статии