Modern C++

W nawiązaniu do poprzedniej notatki, niejakim uzupełnieniem przedstawionych tam informacji i zapowiedzi o dzieleniu się głębszymi przemyśleniami i odczuciami jakimi mnie napełnił kolejny przeprowadzony code review, będą notatki przedstawiające nieco bardziej zaawansowane aspekty i techniki używane w C++.

Mam tu na myśli notatki traktujące o tytułowym "modern C++", czyli nowoczesnym i zaawansowanym C++, gdzie głównie wykorzystywane są wzorce i metaprogramowanie. Myślę, że nie powinno także zabraknąć innych zaawansowanych funkcji oferowanych przez nasz język. Większość będzie silnie powiązana z wykorzystaniem maksymalnie biblioteki STL i boost.

Wszystkie informacje zawarte w poprzedniej notce dotyczące technicznych i logicznych aspektów notatek jakie będą sie pojawiać tutaj również obowiązują. Oczywiście będzie to w trochę innej formie, acz zbliżonej, bo jak już mówiłem "nie chce i nie będę nikogo uczył programowania".

Głównym moim zamiarem jest zaprezentowanie ciekawych, praktycznych rozwiązań i technik jakie sam niedawno użyłem w własnym kodzie, zaimplementowałem lub poznałem. Czasem będą trafiać się też typowe i proste elementy lub podstawy metaprogramowania w C++. Wszystko będzie przedstawione w szczegółach (czasem większych, czasem mniejszych) opisujących "jak i dlaczego" to ma szanse działać i działa w rzeczywistości.

Jako przykład można podać asercje statyczne, wiemy jak, i po co, i dlaczego stosować, wszyscy to robimy, ale na pewno nie wszyscy wiedzą jak i dlaczego to działa, że porównanie wyniku operacji operatora sizoef z czymś, pozwala nam wybiorczo wstrzymać proces kompilacji i czasem wypluć czytelny powód.

Przykładem ciekawego rozwiązania, może być kontrola konkretyzacji wzorca funkcji za pomocą listy typów. Wtedy próba skonkretyzowania wzorca nieodpowiednim typem (dla którego z jakiś powodów nie chcemy konkretyzować wzorca) kompilator zakończy się przerwaniem procesu budowania aplikacji.

Wielką zaletą metaprogramwoania jest "zmuszanie" kompilatora do wygenerowania odpowiedniego, według naszych wytycznych, kodu. W małym skrócie, używamy wzorców w taki sposób, że kompilator w trakcie kompilacji traktuje je jako program do wykonania a wynik operacji - kod, jest często dosyć bardzo zoptymalizowany i wydajny, głównie dzięki rozwijaniu kodu wzorców. Często dzięki wzorcom i metaprogramowaniu możemy "wyjść" poza bariery i ograniczenia języka. No, ale to nie miejsce do wymieniania i zachwycania się możliwościami i zaletami tej techniki.

Akurat jakiś czas temu sam zacząłem się bawić w metaprogramowanie i nieco bardziej zaawansowane użycie wzorców, wykorzystanie ich do czegoś więcej, niż implementacji kolejnego generycznego typu lub klasy. W wielu miejscach pozwala to ułatwić i usprawnić pracę, a nawet lepiej i łatwiej odzwierciedlić logiczną koncepcję i design naszego projektu.

Początkującym adeptom sztuki metaprogramowania, wzorców i zaawansowanych technik, mogę polecić lekturę kilku książek. Większości z nich nie miałem okazji przeczytać (mimo iż kilka posiadam), jedynie co udało mi sie je pobieżnie przejrzeć w oryginalnym wydaniu w wersji angielskiej, ale wydają się być wartościowym materiałem.

Moja mała uwaga, osobiście uważam, że z książek niemożna nauczyć sie programowania. Można poznać ciekawe informacje odnośnie danego tematu, spojrzenie i sposoby rozwiązywania różnych problemów, przez innych, często wybitnych programistów.

Natomiast, aby się nauczyć musimy sami działać.

Bibliografia:

  • Nowoczesne projektowanie w C++ (Modern C++ Design), Andrei Alexandrescu
  • Język C++: Metaprogramowanie za pomocą szablonów (C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond), David Abrahams, Aleksey Gurtovoy
  • C++. Szablony. Vademecum profesjonalisty (C++ Templates The Complete Guide),David Vandevoorde, Nicolai M. Josuttis
  • Więcej niż C++. Wprowadzenie do bibliotek Boost (Beyond the C++ Standard Library: An Introduction to Boost), Björn Karlsson
  • Zaawansowane CPP, wazniak.mimuw.edu.pl

Mam nadzieję, że notatki powstające na fali uniesień przeglądem kodu i prezentacja stosowanych rozwiązań w nowoczesnym C++ będą ciekawe, a nie jedna osoba z nich skorzysta lub sie czegoś nowego nauczy ;)

3 przemyślenia nt. „Modern C++”

  1. Tak – nowoczesne metaprogramowanie jest fajne, ale:

    1. Czas kompilacji programów wykorzystujących templejty znacznie się wydłuża. Odczułem to boleśnie gdy przeszedłem na boosta.

    2. Komunikaty o błędach są kosmicznie długie: jeden komunikat wygenerowany przez g++ może miec ponad ekran i zawiera cały „stos” wywołań templejta. Odnalezienie się w tym gąszczu wymaga nieco ćwiczeń.

    A tak w ogóle to fajny ten blog :-)

    1. To prawda, ale obecnie kompilatory juz nieco lepiej prezentuja bledy z szablonami, gorzej jak gdzies dostaniemy taki surowy, niesformatowany, np. w call stacku to wtedy „droga przez meke” co szczegolnie daje o sobie znac w wielu zagniezdzeniach szablonow, czyli dzien powszedni w przypadku boosta.

      Milo mi slyszec, ze komus sie podoba ;)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *