Klasy cech w programowaniu generycznym

Dokument: pdf (454.9 KB)
  • 3 stron
Opublikowany 2017-07-23 02:02:24

11/20091 Programowanie C++ P rogramowanie generyczne w C++(patrz ramka) wykorzystuje podzbiór kon- strukcji języka, ponieważ byty, który- mi operujemy, muszą mieć ustaloną wartość, znaną podczas kompilacji. Nie można uży- wać zmiennych, nie można wykonywać itera- cji (tworzyć pętli) ani używać instrukcji warun- kowych. Zamiast tego stosujemy techniki, które dająrównoważneefekty.Wdalszejczęścitekstu będzieprzedstawionerozwiązanie,pozwalające na wybór algorytmu, typu lub pewnej stałej, w zależności od parametrów szablonu, co w pro- gramowaniu generycznym odpowiada instruk- cjiwarunkowej. Przedstawiona technika do wyboru od- powiedniego algorytmu lub odpowiedniej wartości wykorzystuje dodatkowe klasy na- zywane trejtami lub klasami cech. Na Li- stingu 1 trejtami są klasy numeric_traits, dostarczają one stałej min_value, o wartości zależnej od parametru szablonu, wykorzy- stując specjalizację. Funkcja find_max znaj- duje maksymalną wartość w tablicy. Inicjuje ona zmienną current_max za pomocą trej- tów, a więc różnymi wartościami dla róż- nych typów. Trejty albo klasy cech są to typy, któ- rych głównym zadaniem jest przechowy- wanie informacji o innych typach. Mecha- nizm ten pozwala uporządkować dostęp do stałych, które mają podobne znacze- nie. Biblioteka standardowa dostarcza trej- tów std::numeric_limits, które definiu- ją wartości graniczne dla wbudowanych ty- pów liczbowych. Aby pobrać wartość takiej stałej, piszemy numeric_limits: :min() zamiast __DBL_MIN__, numeric_ limits::min() zamiast INT_MIN, numeric_limits::max() zamiast INT_MAX, itd. Taki zapis zwalnia programi- stę z obowiązku wyszukiwania nazwy sta- łej dla danego typu oraz nagłówka, który ją deklaruje. Wybór algorytmu w czasie kompilacji Biblioteka standardowa udostępnia kilka innych trejtów, natomiast nowy standard C++200x będzie zawierał kolejnych kilka- dziesiąt, obecnie udostępnianych przez bi- blioteki boost (type_traits, call_traits, function_types). Biblioteki boost są zna- nym zbiorem bibliotek eksperymental- nych C++, z których wiele będzie umiesz- czonych w nowej wersji standardu. Przykładem wykorzystania trejtu has_ trivial_assign, dostępnego w omawia- nym zbiorze, jest funkcja fastCopy, po- kazana na Listingu 2, która kopiuje tabli- ce, wykorzystując std::memcpy (kopiowa- nie bajtów), jeżeli elementy tablicy są ty- pów, dla których kopiowanie takie jest po- prawne, albo algorytm std::copy, jeżeli na- leży wołać operator przypisania dla każde- go obiektu. Trejt has_trivial_assign ba- da, czy typ ma trywialny operator przypi- sania, to znaczy, jeżeli przypisanie dla ty- pu T jest równoznaczne z kopiowaniem pamięci zajmowanej przez obiekt, to has_ trivial_assign jest typu true_type, has_trivial_assign::value ma war- tość true, w przeciwnym wypadku trejt dziedziczy po false_type, zaś składowa value ma wartość false. Funkcja fastCopy wykorzystuje dodatko- wy, czwarty argument, który jest tworzony w czasie kompilacji na podstawie informa- Klasy cech w programowaniu generycznym W języku C++ do tworzenia generycznych algorytmów lub struktur danych używamy szablonów. Artykuł zawiera techniki odpowiadające instrukcji warunkowej, która będzie wykonywana w czasie kompilacji. Dowiesz się: • Jak wybierać algorytm lub wartość w czasie kompilacji; • Co to są klasy cech (trejty). Powinieneś wiedzieć: • Jak pisać proste programy w C++; • Co to są szablony (templates). Poziom trudności Szybki start Aby uruchomić przedstawione rozwiązania, należy mieć dostęp do dowolnego kompi- latora C++ oraz edytora tekstu. Niektóre przykłady zakładają dostęp do bibliotek bo- ost. Warunkiem ich uruchomienia jest instalacja tych bibliotek (w wersji 1.36 lub now- szej) oraz wykorzystywać kompilator oficjalnie przez nie wspierany, to znaczy msvc 7.1 lub nowszy, gcc g++ 3.4 lub nowszy, Intell C++ 8.1 lub nowszy, Sun Studio 12 lub Darvin/GNU C++ 4.x. Na wydrukach pominięto dołączanie odpowiednich nagłówków oraz udostępnianie przestrzeni nazw, pełne źródła dołączono jako materiały pomoc- nicze.Klasy cech w programowaniu generycznymwww.sdjournal.org 2 cji o typie. Jego wartość nie jest istotna, na- tomiast typ pozwala wybrać odpowiednią funkcję kopiującą. Dodatkowy argument, którego typ jest jedyną istotną informacją jest często stosowaną techniką w programo- waniu generycznym.Kompilator wykorzy- stuje typ argumentu do wyboru odpowied- niej wersji funkcji lub metody, nie zwięk- szając wielkości kodu wynikowego (opty- maliztor będący częścią kompilatora usuwa kod związany z argumentami, które nie są wykorzystywane). Innym przykładem wykorzystania klas cech jest szablon getId dostarczający identy- fikatora obiektu. Funkcja ta zwraca identyfi- kator przechowywany w obiekcie, dla obiek- tów typu pochodnego po HasId, albo adres dla pozostałych obiektów. Aby wybrać odpo- wiedni sposób ,stosujemy trejt is_base_of, patrz Listing 3. Rozwiązanie wykorzystuje trejt is_base_ of, zależny od dwu parametrów, dostarcza- jący informacji o tym, czy pierwsz...

Tagi:

Komentarze do: Klasy cech w programowaniu generycznym • 0