#metaprogramowanie

wszystkie notatki oznaczone etykietą "metaprogramowanie"

C++20 formalnie (prawie) gotowe...

http://herbsutter.com/2020/02/15/trip-report-winter-iso-c-standards-meeting-prague/ http://www.reddit.com/r/cpp/comments/f47x4o/202002_prague_iso_c_committee_trip_report_c20_is/

C++17 formalnie (prawie) gotowe...

W marcu tego roku, na spotkaniu komitetu standaryzacyjnego C++ w Kona, technicznie zakończono prace nad nową odsłoną standardu języka C++. Nowy draft DIS (N4660) przesłano do finalnego balotowania przez ISO (ISO ballot) i za 5-6 miesięcy oficjalnie powitamy C++17. Zapewne, prócz drobnych ewentualnych korekt w dokumencie, technicznie nic się nie zmieni, więc nieformalnie takie drafty traktowane są już przez społeczność jako standard. Obecnie ostatnim dostępnym dokumentem jest N4659 (różniący się jedynie formatowaniem od niedostępnego publicznie N4660).

Czytaj dalej

Co słychać w nadchodzącym C++14

Powolnymi, acz zdecydowanymi krokami zbliża się nowy standard języka C++ oznaczony jako C++14. Niektórzy jeszcze nie oswoili się z C++11, a biznes ciągle w epoce kamienia łupanego - C++98/03, bądź “C z klasami”. A tutaj wkrótce kolejna dawka nowości i emocji. Od czasu wejścia obecnego standardu, komitet nieźle przyspieszył, można powiedzieć, że wreszcie chce nadążać za rynkiem i potrzebami. W tym celu planuje co kilka lat wydawać wersję major i_ minor_ nowego standardu tegoż języka, docelowo co 3 lata.

Czytaj dalej

MPU: klasy cech kontenerów STL

Kolejna notatka z serii MPU, opisująca kilka ciekawych konstrukcji zawartych w mistycznym MetaPrograming-Unit. Tym razem o klasach cech opisujących typy kontenerów zawartych w STL. Każdy programista C++ zaznajomiony jest z klasami cech (traits) i ich wielkim potencjałem. Dla tych wszystkich, którzy nie do końca łapią temat, dwa zdania wprowadzające. Klasy cech w C++ są specyficznym typem klas szablonów dostarczających w czasie kompilacji informacji o innych typach bądź strukturach danych. Wykorzystywane są głownie w programowaniu generycznym, przez inne obiekty lub algorytmy do określenia polityki działania lub szczegółów implementacji i realizacji.

Czytaj dalej

MPU: uogólniony begin i end

Według obietnicy z pierwszej notki o MPU chciałbym przedstawić najczęściej używany element, który ułatwia wykorzystywanie standardowych algorytmów operujących na zakresach dla danych przechowywanych w zwykłych tablicach. Oczywiście nie ma żadnego problemu (pomijając wszelkie biblioteki), bo do tej pory tablice w łatwy sposób mogły być używane jako zakresy w dowolnej funkcji algorytmu z STL-a. Przeważnie robiło się to w prosty sposób, podając wskaźnik na początkowy i ostatni + 1 element tablicy. Tak, jak na poniższym przykładzie wypisującym zawartość tablicy:

Czytaj dalej

MPU: Meta-Programing Unit

Wraz ze wzrostem doświadczenia, a raczej ilości “wyklepanych” linii kodu i “przemielonych” projektów rośną nasze zasoby elementów i własnych konstrukcji najchętniej wykorzystywanych w kolejnych projektach. Oczywiście pomijam tutaj sens robienia czegokolwiek co znajduje się w bibliotece standardowej, boost lub jednej z miliona innych popularnych bibliotek. Niemniej, czasami nawet te standardowe i najczęściej używane biblioteki mają jakieś braki lub z innych powodów oferowane przez nie implementacje potrzebnych nam elementów nas nie zadowalają.

Czytaj dalej

Algorytmy STL na tablicach

Często w programach napisanych w C do pobierania rozmiaru tablic (ilości elementów) alokowanych przez kompilator na stosie stosuje się prostą konstrukcję z operatorem sizeof. ładnie “opakowaną” w makro do łatwego użycia: #define SizeOfArray(array) sizeof(array) / sizeof(array[0]) W C++ zamiast makra lepiej wykorzystać wzorzec, a wtedy można to przedstawić w takiej postaci: template<typename T, size_t N> inline size_t SizeOfArray(const T (&)[N]) { return N; } Wersja cpplusowa jest bezpieczniejsza. Próba wywołania SizeOfArray() na wskaźniku zakończy się błędem w czasie kompilacji, w przeciwieństwie do makra, które dopiero da znać o tym problemie w run-time.

Czytaj dalej

TreeLinkedList

Dziś kilka słów o mojej prostej strukturze TreeLinkedList. Jest to prosta drzewiasta struktura, jak sama nazwa wskazuje można ją sobie wyobrazić jako skrzyżowanie drzewa z listą, a dokładniej to hierarchiczne powiązanie drzewem kilku list, gdzie każda gałąź jest listą elementów, które są kolejnymi gałęziami. Twór ten jest bardzo zbliżony do B-tree, aczkolwiek nie posiada wszystkich cech tego typu drzew, jedynie strukturalne podobieństwo. Najprościej byłoby przedstawić ideę graficznie, ale niestety moje predyspozycje graficzne oraz chęci są nikłe.

Czytaj dalej

Matrix

Kiedyś, prawie rok temu kombinowałem coś z dwuwymiarowymi tablicami dynamicznymi. W projekcie xime, lista kontaktów wykorzystuje prostą implementację takowej tablicy opartą na małym rozszerzeniu standardowego wektora. Tablica ta odzwierciedla widoczne w danej chwili w kontrolce elementy, zawiera wskaźniki, bądź proste elementy z wskaźnikami do elementów kontaktów umieszczonych w powiązanym drzewie, coś w stylu B-tree. Idea działania tablicy jest dokładnie taka, jaką opisano w wspomnianej notce, jako ostatnie rozwiązanie. Miałem ostatnio chwilkę, to poprawiłem i doprowadziłem do porządku kod tablicy dwuwymiarowej używany w xime, aby można było go wykorzystać w dowolnym innym miejscu.

Czytaj dalej

Thin Template

Szablony są bardzo elastycznym elementem języka programowania, a ich wykorzystywanie jest bardzo użyteczne. Użycie ich pozwala redukować i minimalizować pisanie oraz powielanie kodu. Jak wiemy konkretyzacja dla danego typu wykonywana jest tylko do używanych metod w szablonach klas, przez co nie jest generowany niepotrzebny kod. Niestety generowany kod wynikowy jest już nieco rozbudowany. Każda konkretyzacja szablonu jest osobna klasa, a dla każdej klasy generowany jest pełny kod potrzebnych funkcji. W przypadku konkretyzacji wzorca typem wskaźnikowym dla każdego rodzaju wskaźnika zostanie wygenerowany “inna” klasa a wraz z nią “podobny” kod wynikowy.

Czytaj dalej