57
Iteratory, Alokatory, Przyszlość C++, Boost Biblioteka STL Sebastian Deorowicz Politechnika Śląska 2006–11–13 Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszlość C++, Boost 2006–11–13 1 / 50

Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Embed Size (px)

Citation preview

Page 1: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Iteratory, Alokatory, Przyszłość C++, BoostBiblioteka STL

Sebastian Deorowicz

Politechnika Śląska

2006–11–13

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 1 / 50

Page 2: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Plan wykładu

1 Iteratory

2 Alokatory

3 Przyszłość C++

4 Biblioteki BoostWyrażenia lambdaPrzydatne narzędzia

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 2 / 50

Page 3: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Plan wykładu

1 Iteratory

2 Alokatory

3 Przyszłość C++

4 Biblioteki BoostWyrażenia lambdaPrzydatne narzędzia

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 3 / 50

Page 4: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Iteratory

Cechy iteratorów

W niektórych zastosowaniach istotne jest aby dysponując typem iteratora można siębyło dowiedzieć, np. o tym jaki jest typ elementów przez niego wskazywany

Można te i inne informacje uzyskać dzięki tzw. cechom iteratorówDla każdego typu iteratora Iterator (różnego od iteratora wyjściowego,dla którego jest nieco inaczej) są zdefiniowane następujące typy:

iterator_traits<Iterator>::difference_type — typ różnicyiterator_traits<Iterator>::value_type — typ wskazywanej wartościiterator_traits<Iterator>::iterator_category — kategoria iteratoraiterator_traits<Iterator>::reference — typ referencji do wskazywanegoobiektuiterator_traits<Iterator>::pointer — typ wskaźnika do wskazywanegoobiektu

Dzięki tym cechom możliwe jest np. pisanie przeciążonych funkcji dla iteratorówróżnego typu — przykładem może być standardowa funkcja distance, która jestróżnie konkretyzowana w zależności od typu iteratora

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 4 / 50

Page 5: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Iteratory

Własne iteratory

Każda klasa iteratora musi mieć zdefiniowane cechy iteratora

Cechy te podaje się konkretyzując klasę iterator, po której dziedziczy tworzonaklasa iteratora

Kiedy i jaki tworzyć iterator?

Iteratory najczęściej tworzy się do nowych kolekcji, bo kolekcje istniejące są całkiemdobrze wyposażone w iteratory

Może jednak być tak, że mamy jakieś specjalne wymagania i wtedy nawetdla standardowych kolekcji warto stworzyć iterator

Jako przykład pokażemy sposób tworzenia iteratora wstawiającego na drugiej pozycjiod początku

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 5 / 50

Page 6: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Iteratory — iterator wstawiający na drugiej pozycji (cz. 1)

Przykład

#include <algorithm>#include <vector>#include <iterator>using namespace std;template<class Collection> class insert_2nd_iterator : public

iterator<output_iterator_tag, void, void, void, void> {protected:

Collection& coll;public:

typedef Collection container_type;explicit insert_2nd_iterator(Collection &c) : coll(c) {}insert_2nd_iterator<Collection>& operator=(const typename Collection::value_type& val) {

if(coll.begin() == coll.end())coll.insert(coll.begin(), val);

elsecoll.insert(++coll.begin(), val);

return *this;}insert_2nd_iterator<Collection>& operator*() {

return *this;}insert_2nd_iterator<Collection>& operator++() {

return *this;}insert_2nd_iterator<Collection>& operator++(int) {

return *this;}

};

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 6 / 50

Page 7: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Iteratory — iterator wstawiający na drugiej pozycji (cz. 2)

Przykład

int _tmain(int argc, _TCHAR* argv[]){

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi, vi2(tab, tab+10);insert_2nd_iterator<vector<int> > ivi(vi);

copy(vi2.begin(), vi2.end(), ivi);ShowCollection(vi); // 0 9 8 7 6 5 4 3 2 1

}

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 7 / 50

Page 8: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Iteratory

Co jeszcze?

Tworzenie własnych iteratorów zostało przedstawione dość pobieżnieWięcej informacji dotyczących tworzenia własnych iteratorów:

B. Stroustrup, Język C++, WNT, Warszawa, 2000N. Josuttis, C++. Biblioteka standardowa. Podręcznik programisty, Helion, 2003

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 8 / 50

Page 9: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Plan wykładu

1 Iteratory

2 Alokatory

3 Przyszłość C++

4 Biblioteki BoostWyrażenia lambdaPrzydatne narzędzia

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 9 / 50

Page 10: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Alokatory

Po co wiedzieć coś więcej o alokatorach?

Tworząc własną kolekcję możemy chcieć zapewnić interfejs zgodny z interfejsemkolekcji STL — one używają alokatorów do przydziału pamięci

Może nam nie odpowiadać działanie domyślnego alokatora i będziemy chcielistworzyć własny

Czym są alokatory?

Alokatory to abstrakcja — wszystko co zachowuje się jak alokator (udostępnia tesame metody) jest alokatorem

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 10 / 50

Page 11: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Alokatory

Metody udostępniane przez alokatory

address(ref) — zwraca adres obiektu przekazanego przez referencję

allocate(size) — alokuje obszar na size elementów

deallocate(ptr, size) — zwalnia obszar pamięci wskazywany przez ptri zajmowany przez size elementów

construct(ptr, val) — konstruuje obiekt pod adresem ptr inicjalizując gowartością val

destroy(ptr) — wywołuje destruktor dla obiektu wskazywanego przez ptr

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 11 / 50

Page 12: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Alokatory

Co trzeba wiedzieć chcąc zdefiniować własny alokator?

Dlaczego nie podoba się nam domyślny alokator

Jak chcemy stworzyć lepszy i czy na pewno będzie się on lepiej sprawował

Źródła wiedzy

B. Stroustrup, Język C++, WNT, Warszawa, 2000

N. Josuttis, C++. Biblioteka standardowa. Podręcznik programisty, Helion, 2003

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 12 / 50

Page 13: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Alokatory

Przykładowy pomysł na nowy alokator

Często domyślny alokator jest tak implementowany, że za każdym razem kiedypotrzebna jest pamięć, wywołuje operator new

Nie ma to większego znaczenia dla kolekcji vector czy deque

Dla kolekcji asocjacyjnych i list może to mieć jednak bardzo duże znaczenie

Operator new rzadko kiedy jest bardzo efektywny, bo musi się komunikowaćz systemem operacyjnymRozwiązaniem mogłoby być np. swego rodzaju „buforowanie” alokacji:

alokator alokuje co jakiś czas większą pulę pamięci i na żądanie udostępnia właśnie jądopiero po wyczerpaniu puli żąda od systemu operacyjnego nowego obszaru pamięciprzy zwalnianiu małych obiektów, pamięć przez nie zajmowana trafia do puli i dopierojeśli jest jej dużo, to zwalnia ją w systemie operacyjnym

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 13 / 50

Page 14: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Plan wykładu

1 Iteratory

2 Alokatory

3 Przyszłość C++

4 Biblioteki BoostWyrażenia lambdaPrzydatne narzędzia

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 14 / 50

Page 15: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Nieco dłuższa historia standaryzacji C++1

1985 — pierwsze wydanie książki B. Stroustrupa, Język C++

1991 — pierwsze spotkanie komitetu standaryzacyjnego WG21

1994 — pierwsza robocza wersja standardu

1996 — druga robocza wersja standardu

1998 — standard C++98

2003 — pierwszy raport techniczny (TR1)

2004 — raport techniczny dotyczący wydajności (Performance TR)

2005 — dokument Library TR1 określający m.in. rozszerzenia bibliotekistandardowej o kolekcje oparte na tablicach mieszających(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf)

2006(7) — dokument Decimal TR zawierający rozszerzenie języka o typyw arytmetyce dziesiętnej, decimal32, decimal64, decimal128(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1977.html)

2007(8) — dokument Library TR2 zawierający kolejne rozszerzenia bibliotekistandardowej, np. prawdopodobnie filesystem z Boost; można też zgłaszać własnepropozycje :-)

ok. 2010 — nowy standard C++0x1Na podstawie http://www.vollmann.ch/en/presentations/cpp-std-041.htmlSebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 15 / 50

Page 16: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Library TR1

Nowe rzeczy

Przestrzeń nazw std::tr1Narzędzia ogólnego przeznaczenia

Inteligentne wskaźniki shared ptr — na podstawie BoostWyrażenia regularne — na podstawie BoostGeneratory liczb pseudolosowych — na podstawie Boost

Narzędzia wspomagające metaprogramowanie za pomocą wzorców:ang. reference wrapperZłączenia lambdaCechy typów (ang. type traits)Krotki (ang. tuples)

KolekcjeTablice stałych rozmiarów o interfejsie kolekcji — na podstawie BoostKolekcje oparte na tablicach mieszających

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 16 / 50

Page 17: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Library TR1

Istniejące implementacje

Na razie tylko Dinkumware (http://www.dinkumware.com/):wersja dla VC++ Express Edition — cena: $80wersja dla VC++6 – VC++2005, GCC pod Linuxa (3.0 — 4.1.1) — cena: $200wersja z kodami źródłowymi — cena: „tylko” $2300

Więcej szczegółów

Ostatnia wersja robocza Library TR1 —http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

Dokumentacja Dinkumware — http://www.dinkumware.com/

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 17 / 50

Page 18: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Kierunki rozwoju C++2

Plany — różnie może jeszcze być z ich realizacją

Zachowanie wstecznej kompatybilności z C++ i C przy jednoczesnym rozwoju

Rozwój narzędzi do programowania generycznego i niskopoziomowego

Ułatwienie startu początkującym, m.in. poprzez garbage collection

Rozszerzenia języka

Wbudowanie Library TR1 do standardu i rozszerzenie go jeszcze o kolejne biblioteki

2Na podstawie http://www.vollmann.ch/en/presentations/cpp-std-041.htmlSebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 18 / 50

Page 19: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Kierunki rozwoju C++

Wybrane artykuły o C++0x

B. Stroustrup, A Brief Look at C++0x, 2006,http://www.artima.com/cppsource/cpp0x.html

G. Reis, B. Stroustrup, Specifying C++ Concepts, 2006,http://www.research.att.com/˜bs/popl06.pdf

B. Stroustrup, The Design of C++0x, 2005,http://www.research.att.com/˜bs/rules.pdf

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 19 / 50

Page 20: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Plan wykładu

1 Iteratory

2 Alokatory

3 Przyszłość C++

4 Biblioteki BoostWyrażenia lambdaPrzydatne narzędzia

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 20 / 50

Page 21: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost

Czym są?

Stanowią rozszerzenie biblioteki standardowej C++

Część z nich została umieszczona w Library TR1, a inne kandydują do Library TR2

W wielu sytuacjach znacząco upraszczają kod

Są oferowane na całkowicie darmowej licencji — jeszcze większa swoboda używaniakodu niż dla GNU GPL

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 21 / 50

Page 22: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Przetwarzanie tekstów3

conversion/lexical cast — konwersje leksykalne (np. między typem string a typamiliczbowymi)

format — operacje podobne do printf, ale bezpieczne pod względem typów

iostreams — strumienie wejścia/wyjścia z możliwością definiowania filtrów

regex — wyrażenia regularne

spirit — narzędzia do tworzenia analizatorów składniowych; zapis gramatykipodobny do notacji EBNF

string algo — algorytmy tekstowe uzupełniające algorytmy obecne w bibliotecestandardowej

tokenizer — przetwarzanie tekstów podzielonych na tokeny

wave — preprocesor funkcjonalnie zgodny preprocesorem C/C++

3Na podstawie http://www.boost.orgSebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 22 / 50

Page 23: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Kolekcje

array — tablice o stałym rozmiarze; interfejs zgodny z STL, zwykle wydajniejszeniż vector

dynamic bitset — alternatywa dla std::bitset umożliwiająca zmiany rozmiaru (zwyklewolniejsza)

graph — grafy (z wieloma algorytmami na nich operującymi)

multi array — tablice wielowymiarowe

multi index — umożliwia indeksowanie kolekcji (w tym standardowych) wedługróżnych kryteriów

pointer container — kolekcje umożliwiające bezpieczne i wygodne przechowywaniewskaźników

property map — definiuje interfejsy łączące obiekty klucze z obiektami wartości

variant — kolekcja będąca uogólnieniem union

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 23 / 50

Page 24: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost – przegląd

Iteratory

graph — iteratory służące do nawigowania po grafach

iterators — środowisko do wygodnego tworzenia iteratorów

operators — wzorce ułatwiające definiowanie operatorów i iteratorów do własnychklas

tokenizer — nawigacja po tekstach przetwarzanych jako tokeny

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 24 / 50

Page 25: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Algorytmy

graph — algorytmy grafowe (np. Dijkstra)

minmax — jednoczesne wyszukiwanie minimum i maksimum

string algo — algorytmy przetwarzania tekstów

utility — różne przydatne narzędzia, które gdzie indziej nie pasowały

range — operacje na zakresach

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 25 / 50

Page 26: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Obiekty funkcyjne i programowanie wyższego rzędu

bind, mem fn — uogólnienie bind1st, bind2nd

funciton — mechanizm wywołań zwrotnych

functional — rozszerzony zestaw adaptatorów obiektów funkcyjnych z STL

functional/hash — haszujące obiekty funkcyjne

lambda — nienazwane obiekty funkcyjne

ref — przekazywanie referencji do obiektów do standardowych funkcji (eliminujekosztowne kopiowanie)

signals — implementacja sygnałów

result of — wyznaczanie typu wyrażenia

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 26 / 50

Page 27: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Programowanie generyczne

call traits — automatyczne wyznaczanie najlepszego sposobu przekazywaniaparametrów

concept check — szablony ułatwiające programowanie generyczne

enable if — sterowanie włączaniem do zbioru specjalizacji branych pod uwagę przywywołaniach przeciążonych

in place factory, typed in place factory — infrastruktura bezpośredniej konstrukcjiobiektów zawieranych

operators — ułatwienie wyposażania klas w operatory

property map — definiuje interfejsy łączące obiekty klucze z obiektami wartości

static assert — asercje czasu kompilacji

type traits — informacje o typach w czasie kompilacji

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 27 / 50

Page 28: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Metaprogramowanie

mpl — metaprogramowanie

static assert — asercje czasu kompilacji

type traits — informacje o typach w czasie kompilacji

Metaprogramowanie preprocesora

preprocessor — programowanie w preprocesorze z użyciem m.in. list, algorytmów,rekursji

Programowanie współbieżne

thread — przenośne programowanie wielowątkowe

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 28 / 50

Page 29: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Metaprogramowanie

mpl — metaprogramowanie

static assert — asercje czasu kompilacji

type traits — informacje o typach w czasie kompilacji

Metaprogramowanie preprocesora

preprocessor — programowanie w preprocesorze z użyciem m.in. list, algorytmów,rekursji

Programowanie współbieżne

thread — przenośne programowanie wielowątkowe

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 28 / 50

Page 30: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Metaprogramowanie

mpl — metaprogramowanie

static assert — asercje czasu kompilacji

type traits — informacje o typach w czasie kompilacji

Metaprogramowanie preprocesora

preprocessor — programowanie w preprocesorze z użyciem m.in. list, algorytmów,rekursji

Programowanie współbieżne

thread — przenośne programowanie wielowątkowe

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 28 / 50

Page 31: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Matematyka

math — różne szablony i funkcje matematyczne

numeric/conversion — bezpieczne konwersje pomiędzy typami numerycznymi

integer — wydajne obliczenia na liczbach całkowitych

interval — rozszerzenie obliczeń matematycznych na przedziały

math/common factor — wyznaczanie NWD i NWW

math/octonion – oktoniony (uogólnienie liczb zespolonych)

math/quaternion — kwaterniony (uogólnienie liczb zespolonych)

math/special functions — funkcje matematyczne takie jak np. atanh

multi array — tablice wielowymiarowe

operators — ułatwienie wyposażania klas w operatory

random — generatory liczb pseudolosowych

rational — obsługa liczb wymiernych

uBLAS — algebra liniowa na wektorach i macierzach

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 29 / 50

Page 32: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Poprawność i testowanie

concept check — szablony ułatwiające programowanie generyczne

static assert — asercje czasu kompilacji

test — narzędzia ułatwiające testowanie aplikacji

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 30 / 50

Page 33: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Struktury danych

any — kolekcja umożliwiająca przechowywanie danych różnych typów

compressed pair — uogólnienie std::pair wydajniej przechowujące pary, w którychjeden z argumentów jest pusty

multi index — umożliwia indeksowanie kolekcji (w tym standardowych) wedługróżnych kryteriów

pointer container — kolekcje umożliwiające bezpieczne i wygodne przechowywaniewskaźników

typle — krotki (uogólnienie std::pair)

variant — kolekcja będąca uogólnieniem union

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 31 / 50

Page 34: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Wejście/wyjście

assign — wygodne przypisywanie szeregu wartości do kolekcji

format — operacje podobne do printf, ale bezpieczne pod względem typów

io state savers — zachowanie stanu obiektów biblioteki iostream

iostreams — strumienie wejścia/wyjścia z możliwością definiowania filtrów

program options — wygodne przetwarzanie parametrów wywołania programuz wiersza poleceń lub parametrów z plików konfiguracyjnych

serialization — serializacja (zachowywanie i przywracanie stanu) obiektów

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 32 / 50

Page 35: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Inne języki programowania

python — współpraca programów w C++ i Pythonie

Pamięć operacyjna

pool — obsługa pul pamięciowych (pojedyncze alokacje na dużą liczbę małychobiektów)

smart ptr — różnego rodzaju „inteligentne” wskaźniki

utility — różne przydatne narzędzia, które gdzie indziej nie pasowały

Parsowanie

spirit — narzędzia do tworzenia parserów

Interfejsy programistyczne

function — mechanizm wywołań zwrotnych

parameter — przekazywanie nazwanych parametrów

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 33 / 50

Page 36: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Inne języki programowania

python — współpraca programów w C++ i Pythonie

Pamięć operacyjna

pool — obsługa pul pamięciowych (pojedyncze alokacje na dużą liczbę małychobiektów)

smart ptr — różnego rodzaju „inteligentne” wskaźniki

utility — różne przydatne narzędzia, które gdzie indziej nie pasowały

Parsowanie

spirit — narzędzia do tworzenia parserów

Interfejsy programistyczne

function — mechanizm wywołań zwrotnych

parameter — przekazywanie nazwanych parametrów

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 33 / 50

Page 37: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Inne języki programowania

python — współpraca programów w C++ i Pythonie

Pamięć operacyjna

pool — obsługa pul pamięciowych (pojedyncze alokacje na dużą liczbę małychobiektów)

smart ptr — różnego rodzaju „inteligentne” wskaźniki

utility — różne przydatne narzędzia, które gdzie indziej nie pasowały

Parsowanie

spirit — narzędzia do tworzenia parserów

Interfejsy programistyczne

function — mechanizm wywołań zwrotnych

parameter — przekazywanie nazwanych parametrów

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 33 / 50

Page 38: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Inne języki programowania

python — współpraca programów w C++ i Pythonie

Pamięć operacyjna

pool — obsługa pul pamięciowych (pojedyncze alokacje na dużą liczbę małychobiektów)

smart ptr — różnego rodzaju „inteligentne” wskaźniki

utility — różne przydatne narzędzia, które gdzie indziej nie pasowały

Parsowanie

spirit — narzędzia do tworzenia parserów

Interfejsy programistyczne

function — mechanizm wywołań zwrotnych

parameter — przekazywanie nazwanych parametrów

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 33 / 50

Page 39: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Biblioteki Boost — przegląd

Różne

conversion — rzutowania polimorficzne i leksykalne

numeric/conversion — konwersje numeryczne

crc — obliczanie sum kontrolnych

date time — operacje na datach

filesystem — przenośne operacje na katalogach, plikach, ścieżkach dostępu

optional — wzorzec uzupełniający typ o wartość specjalną (np. informacje o błędzie)

program options — wygodne przetwarzanie parametrów wywołania programuz wiersza poleceń

timer — przenośny pomiar czasu

tribool — 3-wartościowy typ logiczny

utility — różne przydatne narzędzia, które gdzie indziej nie pasowały

value initialized — unifikacja sposobu inicjalizacji obiektów

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 34 / 50

Page 40: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Czym jest biblioteka lambda?4

Wyrażenia lambda to inaczej funkcje nienazwane

Wyrażenia te przydają się np. wtedy, kiedy mamy do napisania mały obiektfunkcyjny, który zostanie użyty tylko raz i szkoda nam miejsca/czasu na definiowanieobiektu

4Dostępna w pliku nagłówkowym boost/lambda/lambda.hpp i kilku innychSebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 35 / 50

Page 41: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda — zobaczmy jak to wygląda

Przykład

#include "stdafx.h"#include <iostream>#include <vector>#include <algorithm>#include <boost/lambda/lambda.hpp>

using namespace boost::lambda;

int _tmain(int argc, _TCHAR* argv[]){

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};std::vector<int> vi(tab, tab+10);for_each(vi.begin(), vi.end(), std::cout << _1*2 << "\n");

}

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 36 / 50

Page 42: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Wyrażenia lambda

Symbole zastępcze 1, . . . , 9 są cechą charakterystyczną wyrażeń lambda —przechowują argumenty

Nazwy tych symboli można w razie potrzeby przedefiniować

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 37 / 50

Page 43: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Przykład

#include "stdafx.h"#include <iostream>#include <boost/lambda/lambda.hpp>#include <boost/function.hpp>

using namespace boost::lambda;

int _tmain(int argc, _TCHAR* argv[]){

(std::cout << _4 << " " << _3 << " " << _2 << " " << _1 << "\n")("Co", "to", "jest", "lambda"); // lambda to jest Co

boost::function<double(double, double, double)> delta =_2*_2 - 4*_1*_3;

std::cout << delta(2, 3, 5); // -31}

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 38 / 50

Page 44: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Kilka instrukcji w wyrażeniu

Wewnątrz wyrażenia nie wolno użyć średnika, ale można przecinka — jako separatora

Trzeba pamiętać, aby całość ująć w nawiasy

Przykład

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);for_each(vi.begin(), vi.end(), (_1 *= 2, cout << _1 << " "));// 0 2 4 6 8 10 12 14 16 18

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 39 / 50

Page 45: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Wywoływanie funkcji w wyrażeniach lambda

Biblioteka oferuje wzorzec bind służący do wiązania wywołań z parametrami5

Wzorzec znacznie wygodniejszy w użyciu niż standardowe bind1st

Przykład

double power(double x, int n){

double r;for(r = 1; n > 0; n--)

r *= x;return r;

}...int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);for_each(vi.begin(), vi.end(), cout << bind(&power, _1, 3) << " ");// 0 1 8 27 64 125 216 343 512 729

5W pliku nagłówkowym boost/lambda/bind.hppSebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 40 / 50

Page 46: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Przykład

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);

for_each(vi.begin(), vi.end(), cout << _1 << " ");cout << endl; // 0 1 2 3 4 5 6 7 8 9for_each(vi.begin(), vi.end(), cout << " " << _1);cout << endl; // 0123456789for_each(vi.begin(), vi.end(), cout << constant(" ") << _1);cout << endl; // 0 1 2 3 4 5 6 7 8 9

Uwaga na to co jest wyrażeniem lambda

W drugim przykładzie wynik cout << " " nie jest wyrażeniem lambda więc tylkoraz będzie ten kod wykonany

Dopiero pojawienie się _1 sygnalizuje, że mamy do czynienia z wyrażeniem lambda

Trzeba jawnie zapisać, że chodzi o wyrażenie lambda (constant)

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 41 / 50

Page 47: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Przykład

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);

for_each(vi.begin(), vi.end(), cout << _1 << " ");cout << endl; // 0 1 2 3 4 5 6 7 8 9for_each(vi.begin(), vi.end(), cout << " " << _1);cout << endl; // 0123456789for_each(vi.begin(), vi.end(), cout << constant(" ") << _1);cout << endl; // 0 1 2 3 4 5 6 7 8 9

Uwaga na to co jest wyrażeniem lambda

W drugim przykładzie wynik cout << " " nie jest wyrażeniem lambda więc tylkoraz będzie ten kod wykonany

Dopiero pojawienie się _1 sygnalizuje, że mamy do czynienia z wyrażeniem lambda

Trzeba jawnie zapisać, że chodzi o wyrażenie lambda (constant)

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 41 / 50

Page 48: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Przykład

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);

int i = 0;for_each(vi.begin(), vi.end(), cout << "vi[" << i++ << "]=" << _1 << " ");cout << endl;// vi[0]=0 1 2 3 4 5 6 7 8 9for_each(vi.begin(), vi.end(), cout << constant("vi[") << var(i)++ << "]=" << _1 << " ");cout << endl;// vi[1]=0 vi[2]=1 vi[3]=2 vi[4]=3 vi[5]=4 vi[6]=5 vi[7]=6 vi[8]=7 vi[9]=8 vi[10]=9

Uwaga na zmienne

Ze zmiennymi jest analogicznie jak ze stałymi

Jeśli chcemy używać zmiennej, to musimy ją ująć w var()

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 42 / 50

Page 49: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Przykład

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);

int i = 0;for_each(vi.begin(), vi.end(), cout << "vi[" << i++ << "]=" << _1 << " ");cout << endl;// vi[0]=0 1 2 3 4 5 6 7 8 9for_each(vi.begin(), vi.end(), cout << constant("vi[") << var(i)++ << "]=" << _1 << " ");cout << endl;// vi[1]=0 vi[2]=1 vi[3]=2 vi[4]=3 vi[5]=4 vi[6]=5 vi[7]=6 vi[8]=7 vi[9]=8 vi[10]=9

Uwaga na zmienne

Ze zmiennymi jest analogicznie jak ze stałymi

Jeśli chcemy używać zmiennej, to musimy ją ująć w var()

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 42 / 50

Page 50: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Instrukcje sterujące6

if_then(cond, then_code), if_(cond)[then_code] — alternatywnepostacie instrukcji warunkowej

if_then_else(cond, then_code, else_code),if_(cond)[then_code].else_[else_code] — znowu instrukcje warunkowe

while_loop(cond, body), while_(cond)[body] — alternatywne postacieinstrukcji pętli while

while_loop(cond) — pętla while bez ciała

do_while_loop(cond, body), do_[body].while_(cond) — alternatywnepostacie instrukcji pętli do while

do_while_loop(cond) — pętla do while bez ciała

for_loop(init, cond, incr, body), for_(init, cond, incr)[body]— instrukcja pętli for

for_loop(init, cond, incr) — instrukcja pętli for bez ciała

if_then_else_return(cond, then_code, else_code) — operator ?:

6Dostępne w plikach nagłówkowych boost/lambda/if.hpp oraz boost/lambda/loops.hppSebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 43 / 50

Page 51: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Przykład

#include "stdafx.h"#include <algorithm>#include <iostream>#include <vector>#include <boost/lambda/lambda.hpp>#include <boost/lambda/if.hpp>#include <boost/lambda/loops.hpp>using namespace std;using namespace boost::lambda;

int _tmain(int argc, _TCHAR* argv[]){

int tab[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};vector<int> vi(tab, tab+10);

random_shuffle(vi.begin(), vi.end());for_each(vi.begin(), vi.end(), if_(_1 < 5)[cout << _1 << " "].else_[cout << -_1 << " "]);cout << endl; // -8 1 -9 2 0 -5 -7 3 4 -6for_each(vi.begin(), vi.end(),

for_(var(cout) << "\n", _1 > 0, _1--)[var(cout) << "*"]);// ********// *// *********// **// ...

}

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 44 / 50

Page 52: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Lambda

Podsumowanie

Wyrażenia lambda pozwalają na znacznie więcej niż tu pokazano — przykłady miałyraczej zachęcić do poznania biblioteki niż ją w całości zaprezentować

Wyrażenia lambda są pomocne szczególnie wtedy, kiedy normalnie utworzono byniewielki obiekt funkcyjnyDokładniejsze omówienie tych wyrażeń:

B. Karlsson, Więcej niż C++. Wprowadzenie do bibliotek Boost, Helion, 2006http://www.boost.org/doc/html/lambda.html

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 45 / 50

Page 53: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/static assert

Asercje w C++

W C++ dostępne są asercje obliczane w czasie działania programu (assert) —powodują one zatrzymanie wykonywania programu w przypadku wystąpienia błędukrytycznego, który uniemożliwia dalsze działanie programu

Asercje w C++ z Boost

Biblioteka static assert udostępnia makrodefinicję BOOST_STATIC_ASSERTobliczaną w czasie kompilacji — zatrzymuje ona kompilację z komunikatem o błędzie

Kiedy asercje czasu kompilacji mają sens?

Kiedy nie ma sensu kompilować programu, bo programista popełnił błądprzy stosowaniu biblioteki czy własnych funkcji

W metaprogramowaniu, które staje się obecnie coraz popularniejsze

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 46 / 50

Page 54: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/static assert

Przykład

#include "stdafx.h"

#include <boost/static_assert.hpp>using namespace boost;

// Tylko 64-bitowy kompilatorBOOST_STATIC_ASSERT(sizeof(int) == 8);

int _tmain(int argc, _TCHAR* argv[]){

...}

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 47 / 50

Page 55: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Any

Opis

Biblioteka udostępnia klasę any zdolną do przechowywania wartości w zasadziedowolnego typu

Dostępny jest też wzorzec funkcji any cast służącej do „wyciągania” wartościodpowiedniego typu

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 48 / 50

Page 56: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Boost/Any

Przykład

#include "stdafx.h"#include <algorithm>#include <vector>#include <bitset>#include <iostream>#include <boost/any.hpp>using namespace std;using namespace boost;

bool check_string(const any& X) {return any_cast<string>(&X) != NULL;

}

int _tmain(int argc, _TCHAR* argv[]) {vector<any> va;int i = 10;double d = 20.53;string s = "Tekst";bitset<10> b(string("100001110"));

va.push_back(i); va.push_back(d); va.push_back(s);va.push_back(s); va.push_back(b);

cout << count_if(va.begin(), va.end(), check_string) << endl; // 2cout << any_cast<int>(va[0]) << endl; // 10cout << any_cast<string>(va[2]) << endl; // Tekst

}

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 49 / 50

Page 57: Biblioteka STL Sebastian Deorowicz - Strona głównasun.aei.polsl.pl/~sdeor//students/stl/stl_w06.pdf · Biblioteka standardowa. Podręcznik programisty, Helion, 2003 Sebastian Deorowicz

Co będzie za tydzień?

Poznamy kolejne możliwości bibliotek Boost, m.in., wyrażenia regularne, grafy

Dowiemy się o tym jakie są jeszcze inne przydatne i popularne biblioteki

Poznamy ideę metaprogramowania

Sebastian Deorowicz (PŚl) Iteratory, Alokatory, Przyszłość C++, Boost 2006–11–13 50 / 50