Czy CRTP jest często używany? i dlaczego to jest / nie jest? [Zamknięte]

11

Myślę o ciekawie powtarzającym się wzorze szablonu .

Uważam, że jest dość przydatny i można go łatwo dostosować do wielu zadań. Ale muszę przyznać, że nie widzę dużo kodu CRTP na wolności.

Czy trudno to pojąć? Czy funkcje wirtualne są ogólnie łatwiejsze? Czy nie należy go stosować w 90% przypadków, w których pojawia się wirtualne słowo kluczowe?

Koder
źródło

Odpowiedzi:

8

Prostym faktem jest to, że wielu, jeśli nie większość, użytkowników C ++ z trudem rozumie, co vectorjest lepsze niż, malloci freedlatego liczba osób, które mogą nie tylko docenić, ale i wdrożyć zaawansowane metaprogramowanie szablonów, nie jest bardzo wysoka. Oznacza to, że nawet gdyby było to dobre w 90% sytuacji, zobaczyłbyś to w znacznie mniejszym stopniu, po prostu dlatego, że ludzie nie wiedzą o tym i jak z niego korzystać.

Jednak funkcje wirtualne nie mają zalety, a mianowicie, funkcje wirtualne są znacznie łatwiejsze w użyciu niż CRTP. Szablony C ++ są znane z tego, że są wredne na temat praktycznie wszystkiego i wszystkiego, a model włączania jest do bani.

Jednak [funkcje wirtualne] są wyraźnie wolniejsze i mniej wydajne. Na przykład teraz piszę kod przy użyciu CRTP, w którym dziedziczysz przeciążenia operatora do użytku z szablonami wyrażeń. Nie ma możliwości, aby funkcje wirtualne sprawiły, że to zadziała.

DeadMG
źródło
1
Czy to nie ironiczne, że funkcja językowa, której używa CRTP, aby uniknąć użycia „wirtualnego”, jest wredna na temat „wirtualnie” wszystkiego i wszystkiego?
Kaiserludi
6

WTL korzysta z CRTP. Przeglądarka Chromium to dobrze znany przykład oprogramowania korzystającego z WTL, więc powiedziałbym, że jest używany „na wolności”.

O 90%? To zdecydowanie przesada. Czy kiedykolwiek używałeś pojemnika z obiektami polimorficznymi? Jest to bardzo powszechne użycie polimorfizmu i nie można tego zrobić z CRTP, ponieważ Base<DerivedA>to nie to samo, co Base<DerivedB>.

Tamás Szelei
źródło
-5

Oto powody, dla których nie jest on wykorzystywany szerzej:

  1. To jest hack
  2. Jako hack nie ma gwarancji, że nie napotkasz kłopotów podczas korzystania z niego. Normalna obsługa OO była używana przez dużą liczbę projektów i okazało się, że działa poprawnie / problemy są dobrze znane, CRTP występuje tylko w niewielkiej liczbie projektów i żadne dane nie są dostępne
  3. nie ma dobrego powodu, aby z niego korzystać - większość podanych powodów jest po prostu nieprawidłowa
  4. może to skomplikować niektóre rzeczy
tp1
źródło
11
Z pewnością nie jest to hack. Zachowanie jest bardzo dobrze zdefiniowane i jest z niego wiele zastosowań.
DeadMG,
5
Tak, cały STL to duży hack.
Abyx,
czy możesz edytować swoją odpowiedź i wyjaśnić, dlaczego jest to hack?
Nick