Кіріспе

Бағдарламалық жасақтама үлгісі Қызықты қайталанатын үлгі үлгісі (CRTP) - бастапқыда C++ тілінде, онда X класы X-тің өзін үлгі аргументі ретінде пайдалана отырып, сынып үлгісінен алынған идиом. Жалпы алғанда, ол F-тігіс полиморфизм ретінде белгілі және ол F-тігіс кванттаудың бір түрі.

Тарих

Бұл әдіс 1989 жылы "F шектелген сандық анықтау" деп ресмилендірілді. "CRTP" атауын 1995 жылы Джим Коплиен өз бетінше енгізді, ол оны C ++ үлгі кодының кейбір ертелерінде және Тимоти Баддтың Leda көп парадигмалы тілінде жасаған код мысалдарында байқаған. Кейде оны "Жеріктемелі мұра" деп атайды, өйткені ол түрлі базалық сыныптарды ауыстыру арқылы сынып иерархиясын кеңейтуге мүмкіндік береді. Active Template Library (ATL) CRTP-нің Microsoft-тің іске асырылуын 1995 жылы Ян Фалькин өз бетінше тапты, ол кездейсоқ түзілген сыныптан базалық сыныпты шығарды. Кристиан Бомонт алғаш рет Янның кодын көріп, бастапқыда ол кездегі Microsoft компиляторында компиляциялауға болмайды деп ойлады. Оның жұмыс істегенін білгеннен кейін Кристиан осы қатеге негізделген бүкіл ATL және Windows Template Library (WTL) дизайнын жасады.

Қаттылықтар

Статикалық полиморфизмнің бір мәселесі - жоғарыдағы мысалдан AbstractShape сияқты жалпы базалық класты қолданбастан, туынды кластарды біртекті түрде сақтауға болмайды, яғни бір базалық кластан алынған әртүрлі типтерді бір контейнерге орналастыру. Мысалы, std::vector<Shape*> деп анықталған контейнер жұмыс істемейді, өйткені Shape - бұл сынып емес, бірақ мамандандыруды қажет ететін үлгі. std::vector<Shape<Circle>*> ретінде анықталған контейнер тек шеңберлерді ғана сақтай алады, ал квадраттарды емес. Себебі CRTP негіздік Shape класынан алынған кластардың әрқайсысы бірегей тип болып табылады. Бұл мәселенің жалпы шешімі - ортақ базалық сыныптан виртуалды деструктормен мұрагерлік алу, жоғарыда келтірілген AbstractShape мысалы сияқты, std:: vector<AbstractShape*> құруға мүмкіндік береді.