templates c with examples
Научите различите аспекте шаблона на језику Ц ++.
Предлошци су једна од најмоћнијих карактеристика у Ц ++-у. Предлошци нам пружају код који је независан од типа података.
Другим речима, помоћу шаблона можемо да напишемо генерички код који ради на било ком типу података. Само треба да проследимо тип података као параметар. Овај параметар који преноси тип података назива се и именом типа.
У овом упутству детаљно ћемо истражити све о предлошцима и различитим аспектима.
=> Кликните овде за апсолутну Ц ++ серију обуке.
Шта ћете научити:
- Шта су шаблони?
- Како се користе предлошци / примена?
- типенаме Вс. класа кључна реч
- Инстантирање шаблона и специјализација
- Специјализација шаблона
- Ц ++ Вариадиц Темплатес
- Закључак
- Препоручено читање
Шта су шаблони?
Као што је горе поменуто, предлошци су генерички, тј. Независни од типа података. Предлошци се углавном користе да би се осигурала поновна употребљивост кода и флексибилност програма. Можемо једноставно створити једноставну функцију или класу која узима тип података као параметар и применити код који ради за било који тип података.
На пример, ако желимо да алгоритам сортирања ради за све нумеричке типове података као и за низове знакова, тада ћемо само написати функцију која узима тип података као аргумент и применити технику сортирања.
Тада, у зависности од типа података (име типа) који се прослеђује алгоритму за сортирање, можемо податке сортирати без обзира на тип података. На овај начин не треба писати десет алгоритама за десет типова података.
Стога се предлошци могу користити у апликацијама у којима захтевамо да код буде употребљив за више типова података. Предлошци се такође користе у апликацијама где је поновна употреба кода од примарне важности.
Како се користе предлошци / примена?
Предлошци се могу применити на два начина:
- Као предложак функције
- Као предложак класе
Предложак функције
Предложак функције је попут нормалне функције, али једина разлика је у томе што нормална функција може радити само на једном типу података, а код предлошка функције може радити на више типова података.
Иако заправо можемо преоптеретити нормалну функцију за рад на различитим типовима података, предлошци функција су увек кориснији јер морамо да напишемо једини програм који може радити на свим типовима података.
Даље, видећемо имплементацију шаблона функција.
Општа синтакса шаблона функције је:
template T function_name(T args){ …… //function body }
Овде је Т аргумент предлошка који прихвата различите типове података, а класа је кључна реч. Уместо класе кључне речи, можемо написати и „типенаме“.
Када се одређени тип података проследи име-функције, преводилац прави копију ове функције са тим типом података као аргументом и извршава се функција.
Погледајмо пример за боље разумевање шаблона функција.
#include using namespace std; template void func_swap(T &arg1, T &arg2) { T temp; temp = arg1; arg1 = arg2; arg2 = temp; } int main() { int num1 = 10, num2 = 20; double d1 = 100.53, d2 = 435.54; char ch1 = 'A', ch2 = 'Z'; cout << 'Original data
'; cout << 'num1 = ' << num1 << ' num2 = ' << num2<Предлошци предавања Као и у предлошцима функција, можда ћемо имати захтев да имамо класу која је слична свим осталим аспектима, али само различите типове података.
У овој ситуацији можемо имати различите класе за различите типове података или различиту имплементацију за различите типове података у истој класи. Али ово ће учинити наш код гломазним.
Најбоље решење за ово је коришћење класе шаблона. Класа шаблона такође се понаша слично као шаблони функција. Морамо проследити тип података као параметар класи док правимо објекте или позивамо функције члана.
Општа синтакса за предложак класе је:
template class className{ ….. public: T memVar; T memFunction(T args); };
У горњој дефиницији, Т делује као чувар места за тип података. МемВар и мемФунцтион јавних чланова такође користе Т као резервирано место за типове података.
Једном када је класа шаблона дефинисана као горе, можемо створити објекте класе на следећи начин:
className classObejct1; className classObject2; className classObject3;
Применимо пример кода да демонстрирамо предлошке класе:
#include using namespace std; template class myclass { T a, b; public: myclass (T first, T second) {a=first; b=second;} T getMaxval (); }; template T myclass::getMaxval () { return (a>b? a : b); } int main () { myclass myobject (100, 75); cout<<'Maximum of 100 and 75 = '< Излаз:
Највише 100 и 75 = 100
Максимум „А“ и „а“ = а
Горњи програм примењује пример предлошка класе. Имамо класу предлошка мицласс. Унутар овога имамо конструктор који ће иницијализовати два члана а и б класе. Постоји још једна функција члана гетМаквал која је такође предложак функције који враћа највише а и б.
У главној функцији конструишемо два објекта, миобјецт оф типе интегер и мицхобјецт оф типе цхарацтер. Затим позивамо функцију гетМаквал на сваком од ових објеката да бисмо одредили максималну вредност.
Имајте на уму да осим параметара типа предлошка (параметри типа Т), функције предлошка могу имати и уобичајене параметре као што су нормалне функције и такође подразумеване вредности параметара.
типенаме Вс. класа кључна реч
Док декларишемо класу или функцију предлошка, користимо једну од две кључне речи класа или назив типа. Ове две речи су семантички еквивалентне и могу се користити наизменично.
Али у неким случајевима ове речи не можемо користити као еквивалентне. На пример, када користимо зависне типове података у предлошцима попут „типедеф“, користимо типенаме уместо класе.
Такође, кључна реч цласс мора да се користи када морамо експлицитно да направимо инстанцу шаблона.
Инстантирање шаблона и специјализација
Предлошци су написани на генерички начин, што значи да је то општа примена, без обзира на тип података. Према наведеном типу података, треба да генеришемо конкретну класу за сваки тип података.
На пример, ако имамо алгоритам сортирања предлошка, можемо генерисати конкретну класу за сортирање, другу класу за сортирање итд. То се назива инстанцирање шаблона.
Аргументе предлошка (стварни типови података) замењујемо параметрима предлошка у дефиницији класе предлошка.
На пример,
template class sort {};
Када проследимо тип података, преводилац замењује тип података за „Т“ тако да алгоритам сортирања постаје сортирање.
Сваки пут када користимо класу или функцију предлошка, постоји потреба за инстанцом када проследимо одређени тип података. Ако ова инстанца већ није присутна, преводилац креира један са одређеним типом података. Ово је имплицитна инстанција.
Један недостатак имплицитне инстанције је тај што компајлер генерише класу инстанце само за аргументе који се тренутно користе. То значи да ако желимо да генеришемо библиотеку инстанци пре употребе ових инстанци, морамо ићи на експлицитну инстанцију.
Пример декларације шаблона дат је у наставку:
template class Array(T)
Може се експлицитно инстанцирати као:
template class Array
Када се класа инстанцира, сви њени чланови се такође инстанцирају.
Специјализација шаблона
Док програмирамо помоћу шаблона, могли бисмо се суочити са ситуацијом да ће нам бити потребна посебна имплементација за одређени тип података. Када се догоди таква ситуација, идемо на специјализацију за шаблон.
У специјализацији за шаблон, имплементирамо посебно понашање за одређени тип података, осим оригиналне дефиниције шаблона за остале типове података.
На пример, узмите у обзир да имамо класу шаблона „ миИнцремент ’ који има конструктор за иницијализацију вредности и функције шаблона тоИнцремент која вредност увећава за 1.
Ова одређена класа ће савршено радити за све типове података, осим за цхар. Уместо да повећавате вредност за цхар, зашто му не бисте дали посебно понашање и уместо тога претворили знак у велика слова?
Да бисмо то урадили, можемо ићи на специјализацију за предложак за тип података цхар.
Ова примена је приказана у доњем примеру кода.
#include using namespace std; // class template: template class myIncrement { T value; public: myIncrement (T arg) {value=arg;} T toIncrement () {return ++value;} }; // class template specialization: template class myIncrement { char value; public: myIncrement (char arg) {value=arg;} char uppercase () { if ((value>='a')&&(value<='z')) value+='A'-'a'; return value; } }; int main () { myIncrement myint (7); myIncrement mychar ('s'); myIncrement mydouble(11.0); cout<<'Incremented int value: '<< myint.toIncrement()<< endl; cout<<'Uppercase value: '< Излаз:
Повећана вредност инт: 8
Велика вредност: С.
Повећана двострука вредност: 12

У горњем програму који показује специјализацију шаблона, погледајте начин на који смо прогласили специјализовани шаблон за тип цхар. Прво декларишемо оригиналну класу, а затим је „специјализујемо“ за тип цхар. За започињање специјализације користимо празну декларацију предлошка „предложак“.
Затим након назива класе укључујемо тип података. Након ове две промене, класа се пише за тип цхар.
У главној функцији имајте на уму да не постоји разлика између инстанцирања типа цхар и других типова. Једина разлика је у томе што редефинишемо специјализовану класу.
Имајте на уму да морамо дефинисати све чланове специјализоване класе иако су потпуно исти у класи генеричког / оригиналног предлошка. То је зато што немамо функцију наслеђивања за чланове од генеричког шаблона до специјализованог шаблона.
Ц ++ Вариадиц Темплатес
До сада смо видјели предлошке функција који узимају фиксни број аргумената. Постоје и предлошци који узимају променљив број аргумената. Ови предлошци функција називају се варијадни предлошци. Варијадични предлошци су једна од најновијих карактеристика Ц ++ 11.
Варијадни предлошци узимају променљив број аргумената који су безбедни за тип и аргументи се решавају у време компајлирања.
Узмимо комплетан Пример програмирања да бисмо то разумели.
#include #include using namespace std; template T summation(T val) { return val; } template T summation(T first, Args... args) { return first + summation(args...); } int main() { long sum = summation(1, 2, 3, 8, 7); cout<<'Sum of long numbers = '< Горњи пример показује варијадну функцију, „сумирање“. Као што је горе приказано, прво нам је потребна основна функција која имплементира основни случај. Затим имплементирамо варијадну функцију на врху ове функције.
У сумирању функције променљиве назива се „типенаме ... аргс“ пакет параметара предлошка док се назива „Аргс ... аргс“ пакет параметара функције .
Након писања шаблона функције који имплементира основни случај, напишемо варијадичну функцију која имплементира општи случај. Вариадна функција написана је слично рекурзији као што је приказано за сабирање (аргументи ...). Први аргумент је одвојен од пакета параметара функције у тип Т (први).
Са сваким позивом на сабирање, листа параметара се сужава за један аргумент и на крају се постиже основни услов. Излаз приказује збрајање дугих целих бројева и знакова.
Закључак
Овим завршавамо овај водич о предлошцима на Ц ++. Предлошци нам помажу да наше програме учинимо генеричким, тј. Неовисним о типу.
Такође прочитајте = >> Водич за предлошке тиквица
Генерички програми увек стоје на врху осталих програма, јер не морамо писати засебне програме за сваки тип података. Стога развој генерички заштићених програма може бити важан корак ка ефикасном програмирању.
=> Овде потражите детаљне туторијале за обуку за Ц ++.
Препоручено читање
- Водич за главне функције Питхона са практичним примерима
- Како функционише тестирање на основу података (примери КТП и селена)
- Мултитхреадинг у Ц ++ са примерима
- Питхон ДатеТиме Водич са примерима
- Узорак предлошка тест примера са примерима тест примера (преузми)
- Изрежи команду у Унику са примерима
- Пример узорка за извештај о испитивању прихватљивости са примерима
- Синтакса наредбе Уник Цат, опције са примерима