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?
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.
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>.
Oto powody, dla których nie jest on wykorzystywany szerzej:
To jest hack
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
nie ma dobrego powodu, aby z niego korzystać - większość podanych powodów jest po prostu nieprawidłowa
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, coBase<DerivedB>
.źródło
Oto powody, dla których nie jest on wykorzystywany szerzej:
źródło