Простой факт заключается в том, что многие, если не большинство, пользователи C ++ с трудом могут понять, что vectorлучше, чем mallocи free, поэтому число тех, кто может не только оценить, но и реализовать расширенное метапрограммирование шаблонов, не очень велико. Это подразумевает, что даже если бы это было хорошо для 90% ситуаций, вы бы видели это гораздо реже, просто потому, что люди не знают об этом или как его использовать.
Тем не менее, виртуальные функции действительно имеют преимущество, а именно, виртуальные функции гораздо проще в использовании , чем CRTP. Шаблоны C ++ печально известны своей шалостью практически во всем и во всем, а модель включения - отстой.
Однако они [виртуальные функции] заметно медленнее и менее мощны. Например, я сейчас пишу код с использованием CRTP, где вы наследуете перегрузки операторов для использования с шаблонами выражений. Нет никакого способа, которым виртуальные функции могли бы заставить это работать.
Разве это не несколько иронично, что сама языковая функция, которую использует CRTP, чтобы избежать использования «виртуального», озлоблена на «практически» все и вся?
Кайзерлуди
6
WTL использует CRTP. Браузер Chromium является хорошо известным примером программного обеспечения, использующего WTL, поэтому я бы сказал, что оно используется «в дикой природе».
Около 90%? Это определенно преувеличение. Вы когда-нибудь использовали контейнер полиморфных объектов? Это очень распространенное использование полиморфизма, и вы не можете сделать это с CRTP, потому что Base<DerivedA>это не то же самое, что Base<DerivedB>.
Вот причины, почему он не используется более широко:
Это взломать
Как взломщик, не гарантируется, что вы не столкнетесь с проблемами при использовании. Обычные вещи ОО были использованы большим количеством проектов, и было установлено, что они работают должным образом / проблемы хорошо известны, CRTP обнаружен только в небольшом количестве проектов, и данные отсутствуют
нет веских оснований для его использования - большинство приведенных причин просто не действительны
WTL использует CRTP. Браузер Chromium является хорошо известным примером программного обеспечения, использующего WTL, поэтому я бы сказал, что оно используется «в дикой природе».
Около 90%? Это определенно преувеличение. Вы когда-нибудь использовали контейнер полиморфных объектов? Это очень распространенное использование полиморфизма, и вы не можете сделать это с CRTP, потому что
Base<DerivedA>
это не то же самое, чтоBase<DerivedB>
.источник
Вот причины, почему он не используется более широко:
источник