Простой факт заключается в том, что многие, если не большинство, пользователи C ++ с трудом могут понять, что vector
лучше, чем malloc
и free
, поэтому число тех, кто может не только оценить, но и реализовать расширенное метапрограммирование шаблонов, не очень велико. Это подразумевает, что даже если бы это было хорошо для 90% ситуаций, вы бы видели это гораздо реже, просто потому, что люди не знают об этом или как его использовать.
Тем не менее, виртуальные функции действительно имеют преимущество, а именно, виртуальные функции гораздо проще в использовании , чем CRTP. Шаблоны C ++ печально известны своей шалостью практически во всем и во всем, а модель включения - отстой.
Однако они [виртуальные функции] заметно медленнее и менее мощны. Например, я сейчас пишу код с использованием CRTP, где вы наследуете перегрузки операторов для использования с шаблонами выражений. Нет никакого способа, которым виртуальные функции могли бы заставить это работать.