C шаблони
От Seo Wiki - оптимизация и програмиране за търсачки
Шаблони(англ.template) е езиков инструмент C++, предназначен за кодиране на обобщени алгоритми, без да се обвързват с някои параметри (например типове данни, размери на буфери, стойности по подразбиране).
В C++ е възможно да се създават шаблони за функции и класове.
Шаблоните ви позволяват да създавате параметризирани класове и функции. Например, имаме нужда от клас:
Тогава за първия модел пишем:
Въпреки че шаблоните предоставят стенограма за част от кода, използването им всъщност не съкращава изпълнимия код, тъй като компилаторът създава отделен екземпляр на функция или клас за всеки набор от опции.
Съдържание
Синтаксис на описанието на шаблона
Ключовата дума typename е сравнително нова, така че стандартът позволява използването на class вместо typename:
ВместоTвсеки друг идентификатор е приемлив.
Пример за употреба
Най-простият пример е определянето на минимума от две количества.
Ако a е по-малко от b, тогава върнете a, в противен случай върнете b
При липса на шаблони, програмистът трябва да напише отделни функции за всеки използван тип данни. Въпреки че много езици за програмиране дефинират вградена минимална функция за елементарни типове (като цели числа и реални числа), такава функция може да е необходима за сложни (например „време“ или „низ“) и много сложни („играч“ в онлайн игра) обекти.
Ето как изглежда шаблонът за минимална функция:
За да извикате тази функция, можете просто да използвате нейното име:
Извикване на шаблонна функция
Най-общо казано, за да извикате функция на шаблон, трябва да посочите стойности за всички параметришаблон. За да направите това, след името на шаблона се посочва списък със стойности в ъглови скоби:
За всеки набор от опции компилаторът генерира нов екземпляр на функцията. Процесът на създаване на нов екземпляр се нарича инстанциране на шаблон.
В примера по-горе компилаторът създаде две специализации на шаблони за функции за сортиране (за типове char и int) и две специализации на шаблони за четене (за стойности на BufferSize 20 и 30). Последното най-вероятно е разточително, тъй като за всяка възможна стойност на параметъра компилаторът ще създава все повече и повече нови екземпляри на функции, които ще се различават само с една константа.
Извличане на стойности на параметри
В някои случаи компилаторът може да изведе (логически да определи) стойността на параметър на шаблон на функция от аргумент на функция. Например, когато се извиква функцията за сортиране, описана по-горе, не е необходимо да се указва параметър на шаблон (ако съответства на типа елемент на аргумента на масива):
В случай на използване на шаблони на класове с целочислени параметри също е възможно да се изведат тези параметри. Например:
Правилата за извод се въвеждат в езика, за да се улесни използването на шаблон и да се избегнат възможни грешки, като например опит за използване на sort за сортиране на масив от знаци.
Ако даден параметър на шаблон може да бъде изведен от множество аргументи, тогава резултатът от извода трябва да бъде абсолютно еднакъв за всички тези аргументи. Например следните повиквания са грешни:
Грешки в шаблоните
Някои грешки в описанието на шаблона могат да бъдат идентифицирани още на мястото на описанието. Тези грешки не зависят от конкретни настройки. Например:
Грешките, свързани с използването на конкретни параметри на шаблона, не могат да бъдат открити, преди шаблонът да бъде използван. Например, самият шаблон min е без грешки, но използването му с типове запри която операцията ' не е дефинирана, ще доведе до грешка:
Ако въведете операцията ' преди първото използване на шаблона, тогава грешката ще бъде елиминирана. Ето как се проявява гъвкавостта на шаблоните в C++:
Шаблони за класове
В клас, който реализира свързан списък от цели числа, алгоритмите за добавяне на нов елемент към списъка и търсене на желания елемент не зависят от факта, че елементите на списъка са цели числа. Същите алгоритми ще се прилагат за списък със знаци, низове, дати, класове играчи и т.н.
Използване на шаблони
За да използвате шаблон на клас, трябва да посочите неговите параметри:
Технически подробности
Опции за шаблони
Параметрите на шаблона могат да бъдат: параметри на типа, параметри на обикновен тип, параметри на шаблон.
Можете да зададете стойности по подразбиране за параметри от всякакъв тип.
Параметри на шаблона
Ако е необходимо да се използва един и същ шаблон в шаблон на клас или функция, но с различни параметри, тогава се използват параметри на шаблона. Например:
Функционалните шаблони не могат да се използват като параметри на шаблона.
Правила за извличане на аргумент на шаблон на функция
За параметри, които са типове (например параметър T на функцията за сортиране), изводът е възможен, ако аргументът на функцията е от един от следните типове:
Пример е шаблонът за функция за сортиране, обсъден по-горе.
Членове на шаблони на класове
Членовете на шаблон на клас са шаблони и със същата параметризация като шаблона на класа. По-специално това означава, че дефиницията на членските функции трябва да започва със заглавката на шаблона:
В рамките на обхвата на шаблона спецификаторът не трябва да се повтаря. Това означава, че например A ::A() е конструктор, въпреки че можете също да напишете A ::A () .
Типове като членове на класове
Ако параметърът на шаблона е клас, който има член, който е тип данни, тогава ключовата дума typename трябва да се използва за използване на този член. Например:
Шаблони като членове на класове
Има и проблеми с шаблонни членове. Ако шаблон, който е член на клас, който на свой ред е параметър на шаблон, се използва в този шаблон и не позволява извеждане на параметър, тогава трябва да се използва квалификаторът на шаблона:
Шаблони на други езици за програмиране
Езикът Ada има механизми, подобни на шаблоните.
Езикът D има шаблони, които на места са по-мощни от C++. [1]
Java 5 въведе подобен общ механизъм.