Czy warto stosować szablony w C++?

0

Witam mam pytanie tak jak w temacie. Mi się wydaje że warto ale słyszałem opinie że przez szablony trudniej czyta się kod i ktoś powiedział że kompilator trudniej sobie z nimi radzi. Dopiero się uczę chciałbym poznać opinie osób które się na tym znają.

4

Wszystko co napisałeś jest prawdą, z wyjątkiem jednego zdania.

87kelthuzad napisał(a):

ktoś powiedział że kompilator trudniej sobie z nimi radzi.

Kiedyś szablony były problemem dla kompilatorów. Wtedy pojawił się Loki i twórcy kompilatorów za punkt honoru przyjęli sobie, żeby móc kompilować tą bibliotekę. Tylko, że to było ponad 10 lat temu. Obecnie, szablony są dość mocno zakorzenione w języku i niektórych rzeczy w C++ bez ich użycia nie da się zrobić. Niektórzy twierdzą też, że szablony to jedyny ciekawy mechanizm obecny w C++.

Tym nie mniej nie można zapominać, że bywają ciężkie w czytaniu. Komunikaty błędów też bywają bardzo mylące (koncepty - wciąż czekamy!), dlatego używałbym ich z głową. Osobiście sądzę, że szablony pasują do kodu wspomagającego, takiego, który pełni rolę biblioteki dla właściwej logiki.

1

Są istotne powody, by szablonów używać — potrafią znakomicie zmniejszyć ilość pisanego kodu czy pozwolić na bardziej elastyczne rozwiązania i wydajniejsze abstrakcje. Jeśli program, który piszesz, wymaga którejś z tych rzeczy (zwłaszcza biblioteki często korzystają), to znacznie lepiej jest skorzystać z szablonów, niż klepać kod ręcznie.

Tym niemniej, nie każdy program tak ma a wciskanie szablonów tylko po to, żeby było bardziej „obiektowo” i „nowocześnie”, „bo tak się to robi”, to idiotyzm, który Cię kopnie w tyłek pierwszym błędem kompilacji liczonym w megabajtach (sic!).

4

Zacznę od tego, że szablony są znaczną częścią C++, więc jeśli chcesz nauczyć się C++ to musisz także nauczyć się szablonów.
Nie musisz od razu wkuwać na pamięć jak działa template type deduction, czy co tam się dokładnie dzieje w two phase lookup ale bez chociaż podstawowej wiedzy o szablonach ciężko ci będzie nawet korzystać z biblioteki standardowej.

87kelthuzad napisał(a):

słyszałem opinie że przez szablony trudniej czyta się kod

Tutaj oddzieliłbym zwykłe szablony funkcji/klas, które pisze się na co dzień od TMP (template metaprogramming). Do zrozumienia tych pierwszych nie potrzeba wiele wysiłku, natomiast TMP to już inna kwestia.
Prawdą jest także to, że obecnie zdefiniowanie szablonu wymaga napisania sporej ilości boilerplatowego kodu (zwłaszcza jeśli rozbijamy na deklarację i definicję).
To ostatnie może się w przyszłości zmienić na lepsze jeśli np. przegłosowana zostanie propozycja wprowadzenia tzw. abbreviated function templates.

87kelthuzad napisał(a):

ktoś powiedział że kompilator trudniej sobie z nimi radzi

Jak ze wszystkim, sprawa nie jest jednoznaczna ; > Zacznijmy od tego, że proces instancjonowania szablonów odbywa się zawsze w czasie kompilacji, więc dla przykładu możesz w ten sposób wyznaczyć jakieś wartości, zanim jeszcze uruchomisz program.
Szablony są bardzo często w inlinowane co czasami może prowadzić do optymalizacji - patrz np. std::sort vs qsort. Innym przykładem optymalizacji dzięki użyciu szablonów może być expression template - patrz np. lazzy evaluation.
Szablony niosą ze sobą także trochę problemów. Poprzez częste inlinowanie oraz sam proces instancjonowania szablonów z kodu, który w dużym stopniu opiera się na szablonach wygenerowana zostanie duża binarka, czasami bardza duża. Inny problem z szablonami to fakt, że znacząco wydłużają one czas kompilacji (i nawet nadchodzące moduły tego problemu nie rozwiążą).
Powyższe problemy są powodem, dla którego często w systemach wbudowanych/corowych częściach silników gier raczej stara się szablony ograniczać/w ogóle się ich nie używa.

0

wszystkim dziękuje za odpowiedzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1