-
nowość
Opus magnum C++. Wyprawa w głąb C++20. Tom 5 - ebook
Opus magnum C++. Wyprawa w głąb C++20. Tom 5 - ebook
Poznawaj C++20 tak, jakby tłumaczył Ci go doświadczony kolega, z którym siedzisz przy jednym biurku
C++20 to największa od czasu wersji z numerem 11 aktualizacja języka C++. Wprowadza dziesiątki nowych mechanizmów, pozwalających pisać kod, który jest nowocześniejszy, bezpieczniejszy, czytelniejszy i wygodniejszy w utrzymaniu.
Wyprawa w głąb C++20 to kolejny tom cenionego cyklu Opus magnum C++, poświęconego najważniejszym zagadnieniom związanym z językiem C++. Autor, korzystając z wieloletniego doświadczenia zdobytego w międzynarodowych projektach, prowadzi czytelników krok po kroku przez nowe możliwości standardu C++20. Tak jak w poprzednich tomach, trudniejsze kwestie wyjaśnia prostym, przyjaznym językiem, a dodatkowo ilustruje je licznymi przykładami i praktycznymi programami.
Czego się nauczysz?
- Poznasz nowe atrybuty, dzięki którym skuteczniej porozumiesz się z kompilatorem
- Nauczysz się korzystać z trójstanowego operatora porównania (<=>)
- Odkryjesz nowoczesne metody formatowania tekstu z użyciem std::format
- Poznasz mechanizmy std::ranges, które pozwalają wygodniej przetwarzać sekwencje danych
- Dowiesz się, czym są koncepty (concepts) i jak dzięki nim tworzyć bezpieczniejsze i bardziej przejrzyste szablony
- Nauczysz się budować moduły - jako nowoczesny sposób organizowania dużych projektów
- Poznasz korutyny, jedną z najciekawszych i najbardziej nowatorskich możliwości C++20
Jeżeli znasz wcześniejsze standardy C++, ta książka pokaże Ci, jak ogromny krok naprzód wykonał współczesny C++ i pomoże w pełni wykorzystać jego nowe możliwości.
Spis treści
Spis treści
0 Proszę tego nie czytać 1
- 0.1 Wyruszamy na kolejną wyprawę! 1
1 Nowe atrybuty w C++20 3
- 1.1 Atrybuty [[likely\ i [[unlikely\ 3
- 1.2 Atrybut [[nodiscard\ z tekstem 5
- 1.3 Atrybut [[no_unique_address\ do optymalizacji pamięci obiektu 6
- 1.4 Ćwiczenia 8
2 Trójstanowy operator porównania <=> 9
- 2.1 Operator porównania <=> dla typów całkowitych 9
- 2.2 Operator <=> wobec typów zmiennoprzecinkowych 10
- 2.3 Trzeci możliwy typ rezultatu <=>, czyli porównanie słabe (weak_ordering) 13
- 2.4 Operator <=> można zadeklarować jako = default 17
- 2.5 Składniki typu zmiennoprzecinkowego a = default 19
- 2.6 Konwersje między kategoriami porównañ 22
- 2.7 Jak strumieniem cout wypisać rezultat porównania słownie 23
- 2.8 Ćwiczenia 24
3 using enum - co za ulga w C++20! 26
- 3.1 Zwykłe enum (tzw. plain enum) 26
- 3.2 enum class - czyli zakresowy enum 27
- 3.3 C++20 pomaga uproscić zapis (using enum) 28
- 3.4 Ćwiczenia 31
4 Nowoczesne formatowanie tekstu - poznaj std::format 33
- 4.1 Funkcja std::format 33
- 4.2 Znacznik formatujący 34
- 4.3 Pole: id - indeks 35
- 4.4 Dwukropek - rozpoczyna część z określeniami sposobu formatowania 35
- 4.5 Pole formatowania: szerokość 35
- 4.5.1 Szerokość sterowana argumentem (dynamicznie) 36
- 4.6 Pole: wyrównanie (justowanie) 37
- 4.7 Pole: wypełnienie (char) 37
- 4.8 Pole: znak (liczby dodatniej lub ujemnej) 38
- 4.9 Pole: prefix (podstawa systemu liczenia) 38
- 4.10 Pole: wiodące zera 38
- 4.11 Pole: specyfikacja typu wypisywania 39
- 4.12 Pole: precyzja, czyli dokładność 42
- 4.12.1 Na zakończenie - dynamiczne podawanie dokładności 44
- 4.13 Przykłady złożonych znaczników 44
- 4.14 Ćwiczenia 45
5 Span 47
- 5.1 Geneza, czyli skąd ten pomysł? 47
- 5.2 std::span 51
- 5.3 Dalsze korzyści z klasy span<T> 54
- 5.4 Ciekawe funkcje składowe klasy std::span 57
- 5.5 Ćwiczenia 58
6 consteval, constinit - kiedy warto liczyć w compile-time 60
- 6.1 consteval - funkcje wykonywane tylko w trakcie kompilacji 60
- 6.1.1 Tablica liczb obliczana w czasie kompilacji programu 64
- 6.2 constinit - inicjalizacja obiektów statycznych w czasie kompilacji 67
- 6.2.1 constinit - bezpieczna inicjalizacja zmiennych globalnych 69
- 6.2.2 Dobre praktyki: jak definiować i inicjalizować zmienne globalne 71
- 6.3 Kilka przypomnień i przestróg 72
- 6.4 Ćwiczenia - consteval i constinit 72
7 template<auto> w nowej odsłonie 74
- 7.1 Co to jest NTTP? 74
- 7.2 Przykłady różnych NTTP 75
- 7.2.1 Stała zmiennoprzecinkowa jako NTTP w szablonie funkcji 75
- 7.2.2 Stała zmiennoprzecinkowa jako NTTP w szablonie klasy 76
- 7.2.3 Stała będąca obiektem klasy literalnej 77
- 7.2.4 Stała będąca referencją do C-stringu 78
- 7.2.5 Stała będąca pojemnikiem typu std::array 80
- 7.2.6 Stały obiekt struktury (konfiguracja algorytmu) 80
- 7.2.7 Stała NTTP będąca funkcja lambda z przydomkiem constexpr 82
- 7.3 Podsumowanie 83
- 7.4 Ćwiczenia 84
8 Nowości w C++20 dotyczące lambd 88
- 8.1 Przypomnienie 88
- 8.2 C++20 - lambdy z listą parametrów szablonu 89
- 8.3 Ćwiczenia 91
9 Koncepty w C++20 - jak szepnąć kompilatorowi, czego oczekujesz 93
- 9.1 Wymogi i koncepty 93
- 9.2 Gdzie można narzucać wymagania (koncepty)? 96
- 9.3 Porozmawiajmy bliżej o słowie kluczowym requires 97
- 9.4 Z czego może składać się zbiór wymogów? 98
- 9.5 Koncepty z biblioteki standardowej (koncepty standardowe) 99
- 9.5.1 Podstawowe koncepty (warunki) dotyczące typów i ich relacji 100
- 9.5.2 Koncepty związane z porównywaniem wartości 102
- 9.5.3 Koncepty, które sprawdzają zachowania obiektów 102
- 9.5.4 Koncepty dotyczące elementów, które można wywołać jak funkcje 103
- 9.5.5 Koncept dotyczący wyniku wywołania 104
- 9.5.6 Typ relacyjny 105
- 9.5.7 Koncepty relacyjne (porównania i porządek) 107
- 9.6 Kwestia stylu 111
- 9.7 Łączenie konceptów: koniunkcja i alternatywa 112
- 9.8 Koncepty użyte w wyrażeniach lambda 114
- 9.8.1 Parametry o typie wnioskowanym (auto) - czyli lambda bez jawnego <...> 114
- 9.8.2 Lambda z parametrami szablonu - czyli lambda mająca <...> 116
- 9.9 Co tak naprawdę zmieniają koncepty w C++20? 117
- 9.10 Ćwiczenia 117
10 range - zakres sekwencji elementów 119
- 10.1 Przypomnienie o algorytmie std::sort 119
- 10.2 Wkraczamy w krainę ranges 121
- 10.3 Widoki na panoramę górską, czyli views 124
- 10.4 Zestawienie ciekawych funkcji-adapterów views:: 131
- 10.5 Adapter views::iota generujący ciąg liczb i widok 133
- 10.5.1 Jak to wszystko właściwie działa "pod maską"? 135
- 10.6 Adapter views::elements 135
- 10.7 Adaptery views::values, views::keys 136
- 10.8 Adaptery strukturalne views::join, views::split i views::common 138
- 10.8.1 Adapter views::common 141
- 10.9 Od strumienia do sekwencji: wczytywanie danych z użyciem ranges 142
- 10.9.1 Idea: wczytywanie danych za pomocą biblioteki ranges 142
- 10.9.2 Widok interpretujący strumień znaków ze stringu 143
- 10.9.3 Widok interpretujący strumień znaków z pliku 145
- 10.9.4 Widok interpretujący strumień z klawiatury jako dane typu int 147
- 10.10 Pojedynek strumień versus widok 148
- 10.11 Ćwiczenia 150
11 Nowe narzędzie: moduły 153
- 11.1 Pliki nagłówkowe - rozwiązanie z czasów przed C++20 153
- 11.2 Moduły - lepsza wersja nagłówków 154
- 11.3 Jak zbudowany jest plik modułu? 157
- 11.4 Jak to działa - co robi kompilator, gdy spotyka moduł? 163
- 11.5 Definicja klasy w module 163
- 11.5.1 Mała, krótka klasa w module 163
- 11.5.2 Moduł z bardziej rozbudowaną klasą 166
- 11.5.3 Kiedy użyć którego sposobu? 172
- 11.6 Organizacja wiekszych modułów 173
- 11.6.1 Moduł z partycjami 174
- 11.6.2 Blok export i blok export namespace 179
- 11.6.3 Sekcja prywatna w deklaracji modułu 182
- 11.7 Importowanie biblioteki standardowej 187
- 11.8 Jak udało mi się uruchomić moduły w praktyce? 187
- 11.8.1 Konfiguracja krok po kroku w środowisku Qt Creator 188
- 11.9 Ćwiczenia 191
12 Korutyny 193
- 12.1 Skąd ten pomysł? 193
- 12.2 Korutyna - pierwsze starcie 197
- 12.3 Korutyna - jak to wszystko może działać? 200
- 12.4 Co naprawdę robi kompilator przy wywołaniu korutyny? 201
- 12.4.1 Ad krok 2. - Jak naprawdę zbudowany jest Tsterownik_pracy? 204
- 12.4.2 Ad krok 3. - Co w programie robi initial_suspend()? 207
- 12.4.3 Ad krok 5. - Instrukcja co_yield to tak naprawdę jest co_await 208
- 12.4.4 Ad krok 7. - Co robi funkcja final_suspend()? 210
- 12.5 Korutyna, która sukcesywnie dostarcza liczb (generator liczb) 212
- 12.6 Dwukierunkowa korutyna - rozmowa zamiast monologu 215
- 12.7 Korutyny, które przekazują sobie sterowanie 221
- 12.7.1 Przykład programu z dwoma korutynami, które przekazuja sobie sterowanie 223
- 12.8 Gdy korutyna mówi: "Obudź mnie później" 231
- 12.9 Najprostsza pętla zdarzeñ 235
- 12.10 Refleksje o mechanice kończenia działania korutyny 240
- 12.11 Praktyczne użycie - od mechaniki do narzędzia 241
- 12.11.1 ETAP 1. Sterownik, który zwraca wartość 242
- 12.11.2 ETAP 2. Wersja z pilnowaniem własności ramki 244
- 12.11.3 ETAP 3. Gdy jedna korutyna czeka na drugą 247
- 12.11.4 ETAP 4. Wyjatki i propagacja błędów w korutynach 254
- 12.12 Pojedynek korutyny versus wątki 258
- 12.13 Symulacja komunikacji klient - serwer 261
- 12.13.1 To jest paragraf dla zaawansowanych, znających operacje sieciowe 269
- 12.14 Na zakończenie 272
- 12.15 Ćwiczenia 273
13 Posłowie 274
Skorowidz 276
- !
- #include compare 12
- #pragma once 154
- A
- adapter
- adaptery
- algorytm std::sort 119-120
- algorytmy a span 56
- alias enum class 31
- alternatywa konceptów 112-113
- animacja - dławienie się 197
- architektura asynchroniczna 239
- atrybut
- automat stanów 197
- await_ready() 219
- await_resume() 219
- await_suspend() 219
- await_transform 219
- awaiter 209
- B
- BMI - Binary Module Interface 163
- biblioteka
- blok
- bębenkowy licznik 186
- C
- ciąg Fibonacciego 64
- ciągłe sekwencje 47
- co_await - z argumentem 238
- co_await read(socket) 269
- co_await write(socket) 269
- co_return 242
- co_yield 199, 203
- common_reference_with 100
- common_with 100
- compare (#include) 12
- consteval 60-73
- constexpr
- constinit 67-71
- convertible_to 100
- copyable 102-103
- coroutine_handle promise_type > 206
- coroutine_handle< promise_type > 228
- część implementacyjna modułu 171
- część interfejsowa modułu 156
- część przedmodułowa 171
- D
- deklaracja
- derived_from 100
- dokładność podawana dynamicznie 44
- done() 240
- dwukropek w polu formatowania 35
- dynamiczne podawanie dokładności 44
- dyrektywy preprocesora
- dyspozytor 221, 227, 240, 269
- dławienie się animacji 197
- E
- eksportowane nazwy modułu 156
- enum class 27
- enum plain 26
- equality_comparable 102
- equality_comparable_with 102
- equivalence_relation 107
- equivalent 11, 13
- export module - instrukcja 157-158
- extern constinit 71
- F
- Fibonacciego ciąg 64
- fabryka widoków 145
- final_suspend() 201, 210
- floating_point (koncept) 100
- format 33
- from_promise(*this) 206
- funkcja format a mainpulatory 40
- funkcja natychmiastowa 60
- G
- generator liczb 212-214
- get_return_object 202, 206
- globalny fragment modułu 157, 160
- greater 11
- H
- harmonogram 239
- I
- immediate function 60
- implementacja 166
- implementacyjna
- import partycji modułu 177
- importowanie biblioteki standardowej 187
- indeks
- initial_suspend() 201-202, 207
- instrukcja module 157
- integral (koncept) 100
- interfejs modułu 182
- interfejs znaczeniowy 117
- invocable 103
- iteracja 121
- ixx 166
- J
- jednoprzebiegowy zakres 142
- jednoznaczna własność ramki 244
- justowanie 37
- K
- kategorie znaczeniowe 95
- klasa
- klient - serwer komunikacja 261-271
- komunikacja klient - serwer 261-271
- koncept 93
- koncepty
- koniunkcja konceptów 112-113
- konstruktor przenoszący 246
- konwersje między kategoriami porównań 22
- korutyna
- koszt przełączania 259
- L
- lambda
- lenistwo 128-130
- less 11
- liczba jednoczesnych zadań 260
- licznik bębenkowy 186
- likely - atrybut 3
- lokalny zakres
- M
- makrodefinicje
- manipulatory a funkcja format 40
- maszyna stanów 197
- module
- moduł
- moduły 153-192
- movable 102
- N
- natychmiastowa funkcja 60
- nazwa kwalifikowana
- nazwany warunek kompilacyjny 94
- nodiscard - atrybut 5
- noop_coroutine() 228
- nttp - NTTP 74
- O
- One Definition Rule - ODR 154
- obiekt
- odraczanie, rodzaj oszczędności 130
- operacje asynchroniczne 269
- operacje sieciowe 268
- operator
- operator statku kosmicznego 9
- operatory porównania w pakiecie 19
- P
- Perl 9
- partial_ordering 11, 23
- partycje modułu 174
- pieczenie herbatników 124
- plain enum 26
- plik
- pole formatowania 34
- policy_type 200
- port USB - jako span 54
- poziome przekazanie sterowania korutyn 223
- pragma once 154
- precyzja czyli dokładność 42-43
- predicate 105
- prefix (podstawa systemu liczenia) 38
- preprocesora dyrektywy
- private module fragment 183
- promise_type 200
- protokół oczekiwania 219
- prywatny fragment modułu 182
- przekazywanie sterowania 230
- przenoszący operator przypisania 246
- przeplatanie operacji READ i WRITE 268
- przeładowanie trójstanowego op. 15
- przełączanie wykonywania 259
- przynależność modułu 171
- punkty zawieszenia 220
- pusta klasa 6
- pętla zdarzeń 235-239
- R
- ramka korutyny 200-201
- ranges - biblioteka 119
- ranges::filter 127
- ranges::find 124
- ranges::istream_view 144
- ranges::sort 123
- ranges::transform 124
- regular 103
- regular_invocable 103
- relacyjny typ 105
- relation 107
- requires 95
- resume() 198, 203
- rethrow_exception() 254
- return_void() 201
- rezultat porównania słownie 23
- równoległość 260
- S
- śruby - przykład 14
- same_as 100
- scheduler 221, 239-240
- sekcja
- sekcja globalna modułu 157
- sekwencja elementów 121
- semiregular 102
- serwer sieciowy 261
- signed_integral (koncept) 100
- spaceship operator 9
- span 51-53
- span::back() 58
- span::data() 58
- span::empty() 58
- span::first 58
- span::front() 58
- span::last 58
- span::size() 58
- span::size_bytes() 58
- span::subspan 58
- spanning pointer 51
- specyfikacja typu wypisywania 39-41
- statku kosmicznego - operator 9
- stałe odwieczne 63
- std::common_reference_with 100
- std::common_with 100
- std::convertible_to 100
- std::copyable 102-103
- std::derived_from 100
- std::equality_comparable 102
- std::equality_comparable_with 102
- std::equivalence_relation 107
- std::floating_point 100
- std::integral 100
- std::invocable 103
- std::movable 102
- std::predicate 105
- std::regular 103
- std::regular_invocable 103
- std::relation 107
- std::same_as 100
- std::semiregular 102
- std::signed_integral 100
- std::sort 119-120
- std::strict_weak_order 107
- std::totally_ordered 102
- std::totally_ordered_with 102
- std::unsigned_integral 100
- sterownik korutyny 202
- sterownik pracy korutyny 204
- strażnik nagłówka 154
- strict_weak_order 107
- string formatujący 33
- strong_ordering 10, 23
- suspend_always 207
- suspend_never 207
- system asynchroniczny 239
- szablonowa lambda 89
- szerokość - pole formatowania 35-36
- szerokość sterowana argumentem (dynamicznie) 36
- T
- tablica
- template i auto 74
- totally_ordered 102
- totally_ordered_with 102
- trójstanowy operator porównania 9-25
- typ o jawnej strukturze 84
- typ relacyjny 105
- U
- USB port jako span 54
- uchwyt korutyny 228
- unhandled_exception() 240, 254
- union 7
- unlikely - atrybut 4
- unordered 11
- unsigned_integral (koncept) 100
- using enum 28-30
- using namespace std
- V
- view 124-130
- views::all 132
- views::common 132, 138-141
- views::counted 132
- views::drop 132
- views::drop_while 131
- views::elements 131, 135
- views::empty 132
- views::filter 131
- views::iota 132-134
- views::istream 144
- views::join 132, 138-141
- views::key 132
- views::keys 136-137
- views::reverse 129, 132
- views::split 132, 138-141
- views::take 132
- views::take_while 129, 131
- views::transform 128, 131
- views::values 132, 136-137
- W
- warunek wznowienia korutyny 239
- weak_ordering 13-16, 23
- widok (view) 128
- wiodące zera 38
- wnętrze modułu 156, 160
- wyjątki w korutynach 254
- wymogi
- wypełnienie 37
- wypisywanie liczb zmiennoprzecinkowych 40
- wyrównanie 37
- właściciel ramki korutyny 241
- wątki a korutyny 258-260
- Y
- yield 199
- yield_value 201, 208
- Z
- zagnieżdżenie klasy 227
- zakres
- zakresowy enum 27
- zakresowy for a span 56
- zasada jednej definicji (ODR) 154, 163
- zbiór wymogów 98
- zdarzeń pętla 235-239
- zewnętrzny wizerunek (interfejs) modułu 182
- znacznik formatujący 34
- znaczniki stringu formatującego 33
- znak (liczby dodatniej lub ujemnej) 38
- zniszczenie korutyn 268
- zużycie pamięci 259
| Kategoria: | Programowanie |
| Zabezpieczenie: |
Watermark
|
| ISBN: | 978-83-289-4315-5 |
| Rozmiar pliku: | 25 MB |