Кіріспе
Бағдарламалық жасақтама үлгісі Қызықты қайталанатын үлгі үлгісі (CRTP) - бастапқыда C++ тілінде, онда X класы X-тің өзін үлгі аргументі ретінде пайдалана отырып, сынып үлгісінен алынған идиом. Жалпы алғанда, ол F-тігіс полиморфизм ретінде белгілі және ол F-тігіс кванттаудың бір түрі.
The curiously recurring template pattern (CRTP) is an idiom, originally in C++, in which a class X derives from a class template instantiation using X itself as a template argument. More generally it is known as F bound polymorphism, and it is a form of F bounded quantification.
Тарих
Бұл әдіс 1989 жылы "F шектелген сандық анықтау" деп ресмилендірілді. "CRTP" атауын 1995 жылы Джим Коплиен өз бетінше енгізді, ол оны C ++ үлгі кодының кейбір ертелерінде және Тимоти Баддтың Leda көп парадигмалы тілінде жасаған код мысалдарында байқаған. Кейде оны "Жеріктемелі мұра" деп атайды, өйткені ол түрлі базалық сыныптарды ауыстыру арқылы сынып иерархиясын кеңейтуге мүмкіндік береді. Active Template Library (ATL) CRTP-нің Microsoft-тің іске асырылуын 1995 жылы Ян Фалькин өз бетінше тапты, ол кездейсоқ түзілген сыныптан базалық сыныпты шығарды. Кристиан Бомонт алғаш рет Янның кодын көріп, бастапқыда ол кездегі Microsoft компиляторында компиляциялауға болмайды деп ойлады. Оның жұмыс істегенін білгеннен кейін Кристиан осы қатеге негізделген бүкіл ATL және Windows Template Library (WTL) дизайнын жасады.
as well as in code examples that Timothy Budd created in his multiparadigm language Leda. It is sometimes called "Upside Down Inheritance" due to the way it allows class hierarchies to be extended by substituting different base classes. The Microsoft Implementation of CRTP in Active Template Library (ATL) was independently discovered, also in 1995, by Jan Falkin, who accidentally derived a base class from a derived class. Christian Beaumont first saw Jan's code and initially thought it could not possibly compile in the Microsoft compiler available at the time. Following the revelation that it did indeed work, Christian based the entire ATL and Windows Template Library (WTL) design on this mistake.
Қаттылықтар
Статикалық полиморфизмнің бір мәселесі - жоғарыдағы мысалдан AbstractShape сияқты жалпы базалық класты қолданбастан, туынды кластарды біртекті түрде сақтауға болмайды, яғни бір базалық кластан алынған әртүрлі типтерді бір контейнерге орналастыру. Мысалы, std::vector<Shape*> деп анықталған контейнер жұмыс істемейді, өйткені Shape - бұл сынып емес, бірақ мамандандыруды қажет ететін үлгі. std::vector<Shape<Circle>*> ретінде анықталған контейнер тек шеңберлерді ғана сақтай алады, ал квадраттарды емес. Себебі CRTP негіздік Shape класынан алынған кластардың әрқайсысы бірегей тип болып табылады. Бұл мәселенің жалпы шешімі - ортақ базалық сыныптан виртуалды деструктормен мұрагерлік алу, жоғарыда келтірілген AbstractShape мысалы сияқты, std:: vector<AbstractShape*> құруға мүмкіндік береді.