Много ли используется CRTP? и почему это / нет? [закрыто]


11

Я думаю о странно повторяющихся шаблонах .

Я нахожу это весьма полезным, и оно довольно хорошо настраивается для многих задач. Но я должен признать, я не вижу много кода CRTP в дикой природе.

Это трудно понять? Виртуальные функции проще в целом? Не следует ли использовать его в 90% случаев, когда появляется виртуальное ключевое слово?

Ответы:


8

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

Тем не менее, виртуальные функции действительно имеют преимущество, а именно, виртуальные функции гораздо проще в использовании , чем CRTP. Шаблоны C ++ печально известны своей шалостью практически во всем и во всем, а модель включения - отстой.

Однако они [виртуальные функции] заметно медленнее и менее мощны. Например, я сейчас пишу код с использованием CRTP, где вы наследуете перегрузки операторов для использования с шаблонами выражений. Нет никакого способа, которым виртуальные функции могли бы заставить это работать.


1
Разве это не несколько иронично, что сама языковая функция, которую использует CRTP, чтобы избежать использования «виртуального», озлоблена на «практически» все и вся?
Кайзерлуди

6

WTL использует CRTP. Браузер Chromium является хорошо известным примером программного обеспечения, использующего WTL, поэтому я бы сказал, что оно используется «в дикой природе».

Около 90%? Это определенно преувеличение. Вы когда-нибудь использовали контейнер полиморфных объектов? Это очень распространенное использование полиморфизма, и вы не можете сделать это с CRTP, потому что Base<DerivedA>это не то же самое, что Base<DerivedB>.


-5

Вот причины, почему он не используется более широко:

  1. Это взломать
  2. Как взломщик, не гарантируется, что вы не столкнетесь с проблемами при использовании. Обычные вещи ОО были использованы большим количеством проектов, и было установлено, что они работают должным образом / проблемы хорошо известны, CRTP обнаружен только в небольшом количестве проектов, и данные отсутствуют
  3. нет веских оснований для его использования - большинство приведенных причин просто не действительны
  4. это может усложнить некоторые вещи

11
Это, безусловно, не взломать. Поведение очень хорошо определено, и есть много использования его.
DeadMG

5
Да, весь STL - большой взлом.
Abyx

Вы можете отредактировать свой ответ и объяснить, почему это взлом?
Ник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.