Чи багато використовується 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. Як хак, це не гарантує, що ви не зіткнетеся з проблемою, коли будете користуватися нею. Нормальні матеріали OO використовуються великою кількістю проектів, і їхня робота працює належним чином / проблеми добре відомі, CRTP є лише у невеликій кількості проектів, і даних немає.
  3. немає жодних вагомих причин використовувати його - більшість причин, які розміщені, просто не відповідають дійсності
  4. це може ускладнити деякі речі

11
Це, безумовно, не хак. Поведінка дуже чітко визначена, і її багато вживають.
DeadMG

5
Так, цілий STL - це великий злом.
Абікс

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