Шаблонне метапрограмування це техніка метапрограмування в якій шаблони використовуються компілятором для створення тимчасового вихідного коду, які за допомогою компілятора об'єднуються з усім вихідним кодом програми і компілюється. В результаті цих шаблонів під час компіляції отримують константи, структури даних, і цілі функції. Використання шаблонів можна розглядати як створення коду, що виконується під час компіляції. Ця техніка використовуються рядом мов, найвідоміша з яких , а також , D, і .
Деякі мови підтримують схожі, але не більш потужні функції часу компіляції (це такі мови як Lisp із підтримкою макросів).
Компоненти шаблонного метапрограмування
Використання шаблонів як техніки метапрограмування потребує двох різних операцій: шаблон має бути визначений, і повинен бути створений його екземпляр. Визначення шаблону описує загальну форму вихідного коду, а створення екземпляру це його конкретизація, в результаті якої створюються чіткий програмний код із загальної форми описаної в шаблоні.
Шаблонне метапрограмування є повним за Тюрингом, це означає, що будь-яке обчислення задане комп'ютерною програмою може бути обчислене, в деякій формі, за допомогою шаблонного метапрограмування.
Шаблони відрізняються від макросів. Макрос, який також є властивістю мови програмування, яка дозволяє писати код, що виконується під час компіляції, вбудовує згенерований програмний код шляхом текстових маніпуляцій і заміни. Макро системи часто мають обмежені можливості розгалуження процесу під час компіляції і зазвичай недостатню обізнаність про семантику і систему типів мови, з якою вони використовуються (винятком може бути макроси мови Lisp, які самі написані на мові Lisp і здійснюють маніпуляції і заміщення коду Lisp представленого у вигляді структур даних, на відміну від тексту).
Шаблонні метапрограми не мають несталих змінних— тобто, жодна змінна не може змінити значення, після того як була ініціалізована, тому шаблонне програмування можна розглядати як форму функційного програмування. Насправді, більшість реалізацій шаблонів реалізують контроль за ходом виконання програми через рекурсію, як показано далі в прикладі.
Використання шаблонного метапрограмування
Хоча синтаксис шаблонного метапрограмування зазвичай дуже відрізняється від мови програмування з якою він використовується, він має практичну користь. Однією з причин використовування шаблонів, це можливість реалізації загального коду програми (уникаючи схожого коду, що мають незначні відмінності) або виконувати автоматичну оптимізацію під час компіляції, таку як виконання якоїсь дії один раз під час компіляції, а не кожен раз під час виконання програми — наприклад, при наявності циклів в програмі, зменшити кількість підрахунку умови виходу з циклу чи підрахунку кількості циклів всякий раз при виконанні програми.
Генерація класу під час компіляції
Що насправді являє собою "програмування під час компіляції" можна показати на прикладі з функцією підрахунку факторіалу, яка без використання шаблонів C++, може бути реалізована за допомогою рекурсії як показано нижче:
unsigned int factorial(unsigned int n) { return n == 0 ? 1 : n * factorial(n - 1); } // Приклади використання: // factorial(0) дасть 1; // factorial(4) дасть 24.
Код наведений в прикладі буде виконуватись під час роботи програми для визначення значення факторіалу для літералів 4 і 0. З використанням шаблонного метапрограмування і спеціалізації шаблонів, для реалізації умови закінчення для рекурсії для факторіалів, які використовуються в програмі, ігноруючи будь-які факторіали, які не використовуються і можуть бути підраховані під час компіляції за допомогою цього коду:
template <int n> struct factorial { enum { value = n * factorial<n - 1>::value }; }; template <> struct factorial<0> { enum { value = 1 }; }; // Приклади використання: // factorial<0>::value дасть 1; // factorial<4>::value дасть 24.
Наведений код розраховує значення факторіала для літералів 4 і 0 під час компіляції і використовує результат так ніби вони є константами, що були розраховані заздалегідь. Для того, щоб мати змогу використовувати шаблони таким чином, компілятор має знати значення параметру під час компіляції. Іншими словами значення буде відоме заздалегідь лише коли X є константним виразом.
В , було додане ключове слово , яке дозволяє компілятору виконувати прості константні вирази. Використовуючи constexpr, можна застосовувати звичайну рекурсивну функції підрахунку факторіалу.[1] [ 16 лютого 2015 у Wayback Machine.]
Оптимізація коду під час компіляції
Код з підрахунком факторіалу, наведений раніше є прикладом оптимізації коду під час компіляції, при якій всі значення факторіалів, які використовуються в програмі пре-компілюються і вводяться в код як числові константи під час компіляції, тим самим заощаджуючи накладні витрати на час виконання і обсяг пам'яті. Але, тим не менш, це відносно не значна оптимізація.
Як інший, більш значний, приклад розгортання циклу під час компіляції, шаблони можуть використовуватись для створення векторів класу з довжиною n, де n не відома під час компіляції. Перевагою над використанням традиційних векторів з невизначеною довжиною є те, що цикли можуть бути розгорнуті, що дає можливість оптимізувати код. Наприклад, розглянемо . Сумування вектора довжиною n може бути записане як
template <int length> Vector<length>& Vector<length>::operator+=(const Vector<length>& rhs) { for (int i = 0; i < length; ++i) value[i] += rhs.value[i]; return *this; }
Коли компілятор створює екземпляр шаблонної функції, описаної вище, може бути отриманий наступний код:
template <> Vector<2>& Vector<2>::operator+=(const Vector<2>& rhs) { value[0] += rhs.value[0]; value[1] += rhs.value[1]; return *this; }
може розгорнути цикл for
оскільки параметр шаблону length
, що задає його довжину відомий під час компіляції.
Однак, слід мати на увазі, що це може призвести до значного розростання об'єму коду, який генерується для кожного 'N' (розмір вектора), екземпляр якого ви створили.
Статичний поліморфізм
Поліморфізм є загальною стандартною можливістю програмування, завдяки якій об'єкти-нащадки можуть бути використані як екземпляри об'єктів їх базового типу, але із здійсненням викликів методів цих дочірніх об'єктів, як в наведеному прикладі:
class Base { public: virtual void method() { std::cout << "Base"; } virtual ~Base() {} }; class Derived : public Base { public: virtual void method() { std::cout << "Derived"; } }; int main() { Base *pBase = new Derived; pBase->method(); //outputs "Derived" delete pBase; return 0; }
Де всі виклики віртуальних методів (із ключовим словом virtual
) будуть викликати методи найнижчих класів в ієрархії наслідування. Ця динамічна поліморфна поведінка, зазвичай досягається використанням спеціальних віртуальних таблиць функцій для класів із віртуальними методами, по цим таблицям здійснюється прохід під час виконання, для знаходження методу, який необхідно викликати. Таким чином, поліморфізм під час виконання обов'язково має додаткові витрати на виконання коду(хоча для сучасних архітектур ці накладні витрати малі).
Тим не менш, в багатьох випадках поліморфна поведінка, яка потребується в коді інваріантна і може бути визначена під час компіляції. Тоді може бути використаний шаблон "recurring template pattern" для досягнення ефекту статичного поліморфізму, який є імітацією поліморфізму у вигляді програмного коду, але він вирішується під час компіляції і тому не потребує звернень до віртуальних таблиць під час виконання. Наприклад:
template <class Derived> struct base { void interface() { // ... static_cast<Derived*>(this)->implementation(); // ... } }; struct derived : base<derived> { void implementation() { // ... } };
Тут шаблон базового класу користується тим, що реалізації функції члена ініціалізуються лише після їх оголошення, і він буде використовувати члени похідного класу у своїх власних функціями через використання статичного приведення типів static_cast
, таким чином, при компіляції створюються об'єкт, який має поліморфні характеристики. Як приклад наглядного використання, така техніка використана в бібліотеці Boost для створення ітераторів.[2] [ 24 липня 2008 у Wayback Machine.].
Інший подібний приклад використання це "" (Barton–Nackman trick),який іноді називають "обмеженим розширенням шаблону" ("restricted template expansion"), де спільна функціональність розміщується в базовому класі, який використовується не як умовний, а як необхідний компонент для забезпечення сумісної поведінки мінімізуючи надмірність коду.
Переваги та недоліки шаблонного метапрограмування
- Компроміс між часом компіляції і часом виконання
- При значному застосуванні шаблонного метопрограмування компіляція може стати повільною. В залежності від способу використання, шаблони можуть компілюватися швидше або повільніше ніж розгорнутий код.
- Узагальнене програмування
- Шаблонне метопрограмування дозволяє програмісту зосередитися на архітектурі і делегувати компіляцію створення будь-якої реалізації необхідних у клієнтському коді. Таким чином, шаблонне метапрограмування може втілювати по справжньому універсальний код, мінімізуючи код і полегшуючи його підтримку.
- Читабельність
- Що стосується мови C++, синтаксис і ідіоми шаблонного програмування таємничі в порівнянні зі звичайним програмуванням на C++, і шаблонні метапрограми можуть бути важкими для розуміння. Таким чином метапрограми можуть викликати складності при їх підтримці у недосвідчених в шаблонному програмування програмістів, в залежності від складності синтаксису і реалізації.
Див. також
Примітки
- Veldhuizen, Todd L. (PDF). http://ubietylab.net/. Indiana U. CS dept. Архів оригіналу (PDF) за 23 листопада 2015. Процитовано 18 грудня 2014.
- DSL implementation in metaocaml, template haskell, and C++. — University of Waterloo, University of Glasgow, Research Centre Julich, Rice University, 2004. з джерела 5 березня 2016. Процитовано 16 лютого 2015.
- Template Meta-programming for Haskell. — ACM 1-58113-415-0/01/0009, 2002. з джерела 1 березня 2015. Процитовано 16 лютого 2015.
- Generative Programming: Methods, Tools, and Applications. Addison-Wesley. ISBN .
- . : Generic Programming and Design Patterns Applied. Addison-Wesley. ISBN .
- ; (2005). C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond. Addison-Wesley. ISBN .
- ; (2003). C++ Templates: The Complete Guide. Addison-Wesley. ISBN .
- . Reflection in Rewriting Logic: Metalogical Foundations and Metaprogramming Applications. ISBN .
Зовнішні посилання
- . Архів оригіналу за 13 січня 2008. Процитовано 16 лютого 2015.
- . Архів оригіналу за 17 травня 2008. Процитовано 16 лютого 2015. (built using template-metaprogramming)
- . Архів оригіналу за 16 травня 2008. Процитовано 16 лютого 2015. (use STL algorithms easily)
- Veldhuizen, Todd (May 1995). . C++ Report. 7 (4): 36—43. Архів оригіналу за 4 березня 2009. Процитовано 16 лютого 2015.
- . Архів оригіналу за 3 січня 2015. Процитовано 16 лютого 2015. (type-safe metaprogramming in Haskell)
- Bright, Walter. . Архів оригіналу за 7 лютого 2021. Процитовано 16 лютого 2015. (template metaprogramming in the D programming language)
- . (PDF). Архів оригіналу (PDF) за 28 серпня 2014. Процитовано 16 лютого 2015.
- Attardi, Giuseppe; Cisternino, Antonio. (PDF). Архів оригіналу (PDF) за 3 березня 2016. Процитовано 16 лютого 2015.
- STATIC DATA STRUCTURES.
- Amjad, Zeeshan. . Архів оригіналу за 3 січня 2012. Процитовано 16 лютого 2015.
- Amjad, Zeeshan. . Архів оригіналу за 30 грудня 2011. Процитовано 16 лютого 2015.
- . Архів оригіналу за 14 січня 2015. Процитовано 16 лютого 2015.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Shablonne metaprogramuvannya ce tehnika metaprogramuvannya v yakij shabloni vikoristovuyutsya kompilyatorom dlya stvorennya timchasovogo vihidnogo kodu yaki za dopomogoyu kompilyatora ob yednuyutsya z usim vihidnim kodom programi i kompilyuyetsya V rezultati cih shabloniv pid chas kompilyaciyi otrimuyut konstanti strukturi danih i cili funkciyi Vikoristannya shabloniv mozhna rozglyadati yak stvorennya kodu sho vikonuyetsya pid chas kompilyaciyi Cya tehnika vikoristovuyutsya ryadom mov najvidomisha z yakih C a takozh D i Deyaki movi pidtrimuyut shozhi ale ne bilsh potuzhni funkciyi chasu kompilyaciyi ce taki movi yak Lisp iz pidtrimkoyu makrosiv Komponenti shablonnogo metaprogramuvannyaVikoristannya shabloniv yak tehniki metaprogramuvannya potrebuye dvoh riznih operacij shablon maye buti viznachenij i povinen buti stvorenij jogo ekzemplyar Viznachennya shablonu opisuye zagalnu formu vihidnogo kodu a stvorennya ekzemplyaru ce jogo konkretizaciya v rezultati yakoyi stvoryuyutsya chitkij programnij kod iz zagalnoyi formi opisanoyi v shabloni Shablonne metaprogramuvannya ye povnim za Tyuringom ce oznachaye sho bud yake obchislennya zadane komp yuternoyu programoyu mozhe buti obchislene v deyakij formi za dopomogoyu shablonnogo metaprogramuvannya Shabloni vidriznyayutsya vid makrosiv Makros yakij takozh ye vlastivistyu movi programuvannya yaka dozvolyaye pisati kod sho vikonuyetsya pid chas kompilyaciyi vbudovuye zgenerovanij programnij kod shlyahom tekstovih manipulyacij i zamini Makro sistemi chasto mayut obmezheni mozhlivosti rozgaluzhennya procesu pid chas kompilyaciyi i zazvichaj nedostatnyu obiznanist pro semantiku i sistemu tipiv movi z yakoyu voni vikoristovuyutsya vinyatkom mozhe buti makrosi movi Lisp yaki sami napisani na movi Lisp i zdijsnyuyut manipulyaciyi i zamishennya kodu Lisp predstavlenogo u viglyadi struktur danih na vidminu vid tekstu Shablonni metaprogrami ne mayut nestalih zminnih tobto zhodna zminna ne mozhe zminiti znachennya pislya togo yak bula inicializovana tomu shablonne programuvannya mozhna rozglyadati yak formu funkcijnogo programuvannya Naspravdi bilshist realizacij shabloniv realizuyut kontrol za hodom vikonannya programi cherez rekursiyu yak pokazano dali v prikladi Vikoristannya shablonnogo metaprogramuvannya Hocha sintaksis shablonnogo metaprogramuvannya zazvichaj duzhe vidriznyayetsya vid movi programuvannya z yakoyu vin vikoristovuyetsya vin maye praktichnu korist Odniyeyu z prichin vikoristovuvannya shabloniv ce mozhlivist realizaciyi zagalnogo kodu programi unikayuchi shozhogo kodu sho mayut neznachni vidminnosti abo vikonuvati avtomatichnu optimizaciyu pid chas kompilyaciyi taku yak vikonannya yakoyis diyi odin raz pid chas kompilyaciyi a ne kozhen raz pid chas vikonannya programi napriklad pri nayavnosti cikliv v programi zmenshiti kilkist pidrahunku umovi vihodu z ciklu chi pidrahunku kilkosti cikliv vsyakij raz pri vikonanni programi Generaciya klasu pid chas kompilyaciyiSho naspravdi yavlyaye soboyu programuvannya pid chas kompilyaciyi mozhna pokazati na prikladi z funkciyeyu pidrahunku faktorialu yaka bez vikoristannya shabloniv C mozhe buti realizovana za dopomogoyu rekursiyi yak pokazano nizhche unsigned int factorial unsigned int n return n 0 1 n factorial n 1 Prikladi vikoristannya factorial 0 dast 1 factorial 4 dast 24 Kod navedenij v prikladi bude vikonuvatis pid chas roboti programi dlya viznachennya znachennya faktorialu dlya literaliv 4 i 0 Z vikoristannyam shablonnogo metaprogramuvannya i specializaciyi shabloniv dlya realizaciyi umovi zakinchennya dlya rekursiyi dlya faktorialiv yaki vikoristovuyutsya v programi ignoruyuchi bud yaki faktoriali yaki ne vikoristovuyutsya i mozhut buti pidrahovani pid chas kompilyaciyi za dopomogoyu cogo kodu template lt int n gt struct factorial enum value n factorial lt n 1 gt value template lt gt struct factorial lt 0 gt enum value 1 Prikladi vikoristannya factorial lt 0 gt value dast 1 factorial lt 4 gt value dast 24 Navedenij kod rozrahovuye znachennya faktoriala dlya literaliv 4 i 0 pid chas kompilyaciyi i vikoristovuye rezultat tak nibi voni ye konstantami sho buli rozrahovani zazdalegid Dlya togo shob mati zmogu vikoristovuvati shabloni takim chinom kompilyator maye znati znachennya parametru pid chas kompilyaciyi Inshimi slovami znachennya bude vidome zazdalegid lishe koli X ye konstantnim virazom V C 11 bulo dodane klyuchove slovo yake dozvolyaye kompilyatoru vikonuvati prosti konstantni virazi Vikoristovuyuchi constexpr mozhna zastosovuvati zvichajnu rekursivnu funkciyi pidrahunku faktorialu 1 16 lyutogo 2015 u Wayback Machine Optimizaciya kodu pid chas kompilyaciyiKod z pidrahunkom faktorialu navedenij ranishe ye prikladom optimizaciyi kodu pid chas kompilyaciyi pri yakij vsi znachennya faktorialiv yaki vikoristovuyutsya v programi pre kompilyuyutsya i vvodyatsya v kod yak chislovi konstanti pid chas kompilyaciyi tim samim zaoshadzhuyuchi nakladni vitrati na chas vikonannya i obsyag pam yati Ale tim ne mensh ce vidnosno ne znachna optimizaciya Yak inshij bilsh znachnij priklad rozgortannya ciklu pid chas kompilyaciyi shabloni mozhut vikoristovuvatis dlya stvorennya vektoriv klasu z dovzhinoyu n de n ne vidoma pid chas kompilyaciyi Perevagoyu nad vikoristannyam tradicijnih vektoriv z neviznachenoyu dovzhinoyu ye te sho cikli mozhut buti rozgornuti sho daye mozhlivist optimizuvati kod Napriklad rozglyanemo Sumuvannya vektora dovzhinoyu n mozhe buti zapisane yak template lt int length gt Vector lt length gt amp Vector lt length gt operator const Vector lt length gt amp rhs for int i 0 i lt length i value i rhs value i return this Koli kompilyator stvoryuye ekzemplyar shablonnoyi funkciyi opisanoyi vishe mozhe buti otrimanij nastupnij kod template lt gt Vector lt 2 gt amp Vector lt 2 gt operator const Vector lt 2 gt amp rhs value 0 rhs value 0 value 1 rhs value 1 return this mozhe rozgornuti cikl for oskilki parametr shablonu length sho zadaye jogo dovzhinu vidomij pid chas kompilyaciyi Odnak slid mati na uvazi sho ce mozhe prizvesti do znachnogo rozrostannya ob yemu kodu yakij generuyetsya dlya kozhnogo N rozmir vektora ekzemplyar yakogo vi stvorili Statichnij polimorfizmPolimorfizm ye zagalnoyu standartnoyu mozhlivistyu programuvannya zavdyaki yakij ob yekti nashadki mozhut buti vikoristani yak ekzemplyari ob yektiv yih bazovogo tipu ale iz zdijsnennyam viklikiv metodiv cih dochirnih ob yektiv yak v navedenomu prikladi class Base public virtual void method std cout lt lt Base virtual Base class Derived public Base public virtual void method std cout lt lt Derived int main Base pBase new Derived pBase gt method outputs Derived delete pBase return 0 De vsi vikliki virtualnih metodiv iz klyuchovim slovom virtual budut viklikati metodi najnizhchih klasiv v iyerarhiyi nasliduvannya Cya dinamichna polimorfna povedinka zazvichaj dosyagayetsya vikoristannyam specialnih virtualnih tablic funkcij dlya klasiv iz virtualnimi metodami po cim tablicyam zdijsnyuyetsya prohid pid chas vikonannya dlya znahodzhennya metodu yakij neobhidno viklikati Takim chinom polimorfizm pid chas vikonannya obov yazkovo maye dodatkovi vitrati na vikonannya kodu hocha dlya suchasnih arhitektur ci nakladni vitrati mali Tim ne mensh v bagatoh vipadkah polimorfna povedinka yaka potrebuyetsya v kodi invariantna i mozhe buti viznachena pid chas kompilyaciyi Todi mozhe buti vikoristanij shablon recurring template pattern dlya dosyagnennya efektu statichnogo polimorfizmu yakij ye imitaciyeyu polimorfizmu u viglyadi programnogo kodu ale vin virishuyetsya pid chas kompilyaciyi i tomu ne potrebuye zvernen do virtualnih tablic pid chas vikonannya Napriklad template lt class Derived gt struct base void interface static cast lt Derived gt this gt implementation struct derived base lt derived gt void implementation Tut shablon bazovogo klasu koristuyetsya tim sho realizaciyi funkciyi chlena inicializuyutsya lishe pislya yih ogoloshennya i vin bude vikoristovuvati chleni pohidnogo klasu u svoyih vlasnih funkciyami cherez vikoristannya statichnogo privedennya tipiv static cast takim chinom pri kompilyaciyi stvoryuyutsya ob yekt yakij maye polimorfni harakteristiki Yak priklad naglyadnogo vikoristannya taka tehnika vikoristana v biblioteci Boost dlya stvorennya iteratoriv 2 24 lipnya 2008 u Wayback Machine Inshij podibnij priklad vikoristannya ce Barton Nackman trick yakij inodi nazivayut obmezhenim rozshirennyam shablonu restricted template expansion de spilna funkcionalnist rozmishuyetsya v bazovomu klasi yakij vikoristovuyetsya ne yak umovnij a yak neobhidnij komponent dlya zabezpechennya sumisnoyi povedinki minimizuyuchi nadmirnist kodu Perevagi ta nedoliki shablonnogo metaprogramuvannyaKompromis mizh chasom kompilyaciyi i chasom vikonannya Pri znachnomu zastosuvanni shablonnogo metoprogramuvannya kompilyaciya mozhe stati povilnoyu V zalezhnosti vid sposobu vikoristannya shabloni mozhut kompilyuvatisya shvidshe abo povilnishe nizh rozgornutij kod Uzagalnene programuvannya Shablonne metoprogramuvannya dozvolyaye programistu zosereditisya na arhitekturi i deleguvati kompilyaciyu stvorennya bud yakoyi realizaciyi neobhidnih u kliyentskomu kodi Takim chinom shablonne metaprogramuvannya mozhe vtilyuvati po spravzhnomu universalnij kod minimizuyuchi kod i polegshuyuchi jogo pidtrimku Chitabelnist Sho stosuyetsya movi C sintaksis i idiomi shablonnogo programuvannya tayemnichi v porivnyanni zi zvichajnim programuvannyam na C i shablonni metaprogrami mozhut buti vazhkimi dlya rozuminnya Takim chinom metaprogrami mozhut viklikati skladnosti pri yih pidtrimci u nedosvidchenih v shablonnomu programuvannya programistiv v zalezhnosti vid skladnosti sintaksisu i realizaciyi Div takozhMetaprogramuvannya PreprocesorPrimitkiVeldhuizen Todd L PDF http ubietylab net Indiana U CS dept Arhiv originalu PDF za 23 listopada 2015 Procitovano 18 grudnya 2014 DSL implementation in metaocaml template haskell and C University of Waterloo University of Glasgow Research Centre Julich Rice University 2004 z dzherela 5 bereznya 2016 Procitovano 16 lyutogo 2015 Template Meta programming for Haskell ACM 1 58113 415 0 01 0009 2002 z dzherela 1 bereznya 2015 Procitovano 16 lyutogo 2015 Generative Programming Methods Tools and Applications Addison Wesley ISBN 0 201 30977 7 Modern C Design Generic Programming and Design Patterns Applied Addison Wesley ISBN 3 8266 1347 3 2005 C Template Metaprogramming Concepts Tools and Techniques from Boost and Beyond Addison Wesley ISBN 0 321 22725 5 2003 C Templates The Complete Guide Addison Wesley ISBN 0 201 73484 2 Reflection in Rewriting Logic Metalogical Foundations and Metaprogramming Applications ISBN 1 57586 238 7 Zovnishni posilannya Arhiv originalu za 13 sichnya 2008 Procitovano 16 lyutogo 2015 Arhiv originalu za 17 travnya 2008 Procitovano 16 lyutogo 2015 built using template metaprogramming Arhiv originalu za 16 travnya 2008 Procitovano 16 lyutogo 2015 use STL algorithms easily Veldhuizen Todd May 1995 C Report 7 4 36 43 Arhiv originalu za 4 bereznya 2009 Procitovano 16 lyutogo 2015 Arhiv originalu za 3 sichnya 2015 Procitovano 16 lyutogo 2015 type safe metaprogramming in Haskell Bright Walter Arhiv originalu za 7 lyutogo 2021 Procitovano 16 lyutogo 2015 template metaprogramming in the D programming language PDF Arhiv originalu PDF za 28 serpnya 2014 Procitovano 16 lyutogo 2015 Attardi Giuseppe Cisternino Antonio PDF Arhiv originalu PDF za 3 bereznya 2016 Procitovano 16 lyutogo 2015 STATIC DATA STRUCTURES Amjad Zeeshan Arhiv originalu za 3 sichnya 2012 Procitovano 16 lyutogo 2015 Amjad Zeeshan Arhiv originalu za 30 grudnya 2011 Procitovano 16 lyutogo 2015 Arhiv originalu za 14 sichnya 2015 Procitovano 16 lyutogo 2015