C++20 - The Complete Guide
C++20 - The Complete Guide
About the Book
C++20 is the next evolution in modern C++ programming, which will be supported step-by-step by the latest version of gcc, clang, and Visual C++.
C++20 is a big step, maybe even larger than C++11.
It contains a couple of new key features (modules, concepts, ranges, corountines) plus several small but valuable language and library features, which will change the way we program in C++. As usual, not everything is self-explanatory, combining new features gives even more power, and there are hidden traps.
This book presents all the new language and library features of C++20. It covers the motivation and context of each new feature with examples and background information. The focus is on how these features impact day-to-day programming, what it means to combine them, and how to benefit from C++20 in practice.
Buy early, pay less, free updates
Note that this book is published step-by-step. The first public version was published in June 2021. Since then, the contents grows with new chapters, examples, and caveats about the features of C++20 and I integrate all feedback I get for the pages already published.
See cppstd20.com for a detailed list of topics already covered.
As written, once you bought it you will get all updates for free.
PDF versus Other Formats
I write the book in LaTeX and generate PDF from it (the way I wrote my other books). The other formats (epub, mobi, and online reading) come from the leanpub markdown interface, for which I generate the necessary input from LaTeX by script.
Thus, the PDF layout has a better quality than the other formats. For example, the syntax highlighting rules for the formats other than PDF have to get fixed as soon as possible and the index is missing yet. Leanpub and me are working on corresponding improvements.
I hope you enjoy and benefit.
Nico
#cpp20tcg
Table of Contents
-
1. Preface
- 1.1 An Experiment
- 1.2 Versions of This Book
- 1.3 Acknowledgments
-
2. About This Book
- 2.1 What You Should Know Before Reading This Book
- 2.2 Overall Structure of the Book
- 2.3 How to Read This Book
-
2.4 The Way I Implement
- 2.4.1 Initializations
- 2.4.2 Error Terminology
- 2.4.3 Code Simplifications
- 2.5 The C++ Standards
- 2.6 Example Code and Additional Information
- 2.7 Feedback
-
3. Comparisons and Operator
<=>
-
3.1 Motivation for Operator
<=>
- 3.1.1 Defining Comparison Operators Before C++20
- 3.1.2 Defining Comparison Operators Since C++20
-
3.2 Defining and Using Comparisons
-
3.2.1 Using Operator
<=>
- 3.2.2 Comparison Category Types
-
3.2.3 Using Comparison Categories with
operator<=>
-
3.2.4 Calling
operator<=>
- 3.2.5 Dealing with Multiple Ordering Criteria
-
3.2.1 Using Operator
-
3.3 Defining
operator<=>
andoperator==
-
3.3.1 Defaulted
operator<=>
-
3.3.2 Defaulted
operator<=>
and Inheritance
-
3.3.1 Defaulted
- 3.4 Overload Resolution with Rewritten Expressions
-
3.5 Using Operator
operator
<=>
in Generic Code-
3.5.1
compare_three_way
-
3.5.2 Algorithm
lexicographical_compare_three_way()
-
3.5.1
- 3.6 Compatibility Issues with the Comparison Operators
- 3.7 Afternotes
-
3.1 Motivation for Operator
-
4. Placeholder Types for Function Parameters
-
4.1
auto
for Parameters of Ordinary Functions-
4.1.1 Deferred Type Checks with
auto
-
4.1.2
auto
for Parameters of Member Functions -
4.1.3
auto
Functions versus Lambdas -
4.1.4
auto
for Parameters in Detail
-
4.1.1 Deferred Type Checks with
- 4.2 Other Placeholder Types for Parameters of Ordinary Functions
- 4.3 Afternotes
-
4.1
-
5. Concepts and Requirements
-
5.1 Motivating Example of Concepts and Requirements
- 5.1.1 Improving the Template Step-by-Step
- 5.1.2 The Whole Resulting Program
-
5.2 Typical Application of Concepts and Requirements in Practice
- 5.2.1 Requirements to Understand Code and Error Messages
- 5.2.2 Requirements to Disable Generic Code
- 5.2.3 Requirements to Use Different Statements
- 5.2.4 The Example as a Whole
- 5.2.5 Former Workarounds
-
5.3 Constraints and Requirements in Detail
- 5.3.1 Constraints
- 5.3.2 Ad hoc Boolean Expressions
-
5.3.3
requires
Expressions
-
5.4 Concepts in Detail
- 5.4.1 Defining Concepts
- 5.4.2 Special Abilities of Concepts
- 5.4.3 Using Concepts as Type Constraints
-
5.5 Subsuming Constraints and Concepts
- 5.5.1 Indirect Subsumptions
- 5.6 Semantic Constraints
-
5.7 Design Guidelines for Concepts
- 5.7.1 Dealing with Multiple Requirements
- 5.7.2 Concepts versus Traits and Expressions
-
5.7.3 When to Use
if
constexpr
- 5.8 Other Stuff of Concepts
- 5.9 Afternotes
-
5.1 Motivating Example of Concepts and Requirements
-
6. Standard Concepts in Detail
-
6.1 Overview of all Standard Concepts
- 6.1.1 Header Files and Namespaces
- 6.1.2 Standard Concepts Subsume
-
6.2 Language-Related Concepts
- 6.2.1 Arithmetic Concepts
- 6.2.2 Object Concepts
- 6.2.3 Concepts for Relations between Types
- 6.2.4 Comparison Concepts
-
6.3 Concepts for Iterators and Ranges
- 6.3.1 Concepts for Ranges and Views
- 6.3.2 Concepts for Pointers-Like Objects
- 6.3.3 Concepts for Iterators
- 6.3.4 Iterator Concepts for Algorithms
-
6.4 Concepts for Callables
- 6.4.1 Basic Concepts for Callables
- 6.4.2 Concepts for Callables Used by Iterators
-
6.5 Auxiliary Concepts
- 6.5.1 Concepts for Specific Type Attributes
- 6.5.2 Concepts for Incrementable Types
- 6.6 Open
- 6.7 Afternotes
-
6.1 Overview of all Standard Concepts
-
7. Ranges and Views
-
7.1 A Tour of Ranges by Example
- 7.1.1 Passing Containers to Algorithms as Ranges
- 7.1.2 Constraints and Utilities for Ranges
- 7.1.3 Views
- 7.1.4 Sentinels
- 7.1.5 Range Definitions with Sentinels and Counts
- 7.1.6 Projections
- 7.1.7 Utilities to Implement Code for Ranges
- 7.1.8 Limitations and Drawbacks of Ranges
-
7.2 Using Views
- 7.2.1 Views on Ranges
- 7.2.2 Pipelines for Temporary Ranges
- 7.2.3 Lazy Evaluation
- 7.2.4 Performance Issues with Filters
- 7.2.5 Views and Pipelines with Write Access
- 7.2.6 Write Access with Filter Views
-
7.3 Borrowed Iterators and Ranges
- 7.3.1 Borrowed Iterators
- 7.3.2 Borrowed Ranges
-
7.4 Ranges and
const
-
7.4.1 Views Remove the Propagation of
const
- 7.4.2 Bringing Back Deep Constness to Views
-
7.4.3 Generic Code Should Take Ranges with Non-
const
&&
-
7.4.1 Views Remove the Propagation of
- 7.5 Open
- 7.6 Afternotes
-
7.1 A Tour of Ranges by Example
-
8. Utilities for Ranges and View
-
8.1 Major Range Adaptors
-
8.1.1 Range Adaptor
all()
-
8.1.2 Range Adaptor
counted()
-
8.1.3 Range Adaptor
common()
-
8.1.1 Range Adaptor
-
8.2 New Iterators
-
8.2.1
std::counted_iterator
-
8.2.2
std::common_iterator
-
8.2.3
std::default_sentinel
-
8.2.4
std::unreachable_sentinel
-
8.2.1
-
8.3 New Functions and Type Functions in
std::ranges
- 8.3.1 Auxiliary Value Functions
- 8.3.2 Auxiliary Type Functions
- 8.4 Algorithm Overview
- 8.5 Open
- 8.6 Afternotes
-
8.1 Major Range Adaptors
-
9. View Types in Detail
-
9.1 Overview of all Views
- 9.1.1 Overview of Source Views
- 9.1.2 Overview of Adapting Views
- 9.2 Base Classes for Views
-
9.3 Creating Views to External Elements
- 9.3.1 Subranges
- 9.3.2 Ref View
- 9.3.3 Owning View
- 9.3.4 Common View
-
9.4 Generating Views
- 9.4.1 Iota View
- 9.4.2 Single View
- 9.4.3 Empty View
- 9.4.4 IStream View
- 9.4.5 String View
-
9.5 Filtering Views
- 9.5.1 Take View
- 9.5.2 Take-While View
- 9.5.3 Drop View
- 9.5.4 Drop-While View
- 9.5.5 Filter View
-
9.6 Transforming Views
- 9.6.1 Transform View
- 9.6.2 Elements View
- 9.6.3 Keys View
- 9.6.4 Values View
-
9.7 Mutating Views
- 9.7.1 Reverse View
-
9.8 Views for Multiple Ranges
- 9.8.1 Split and Lazy-Split View
- 9.8.2 Join View
- 9.9 Open
- 9.10 Afternotes
-
9.1 Overview of all Views
-
10. Spans
-
10.1 Using Spans
- 10.1.1 Fixed and Dynamic Extent
- 10.1.2 Example Using a Span with Fixed Extent
- 10.1.3 Example Using a Span with a Dynamic Extent
- 10.2 Spans Considered Harmful
-
10.3 Design Aspects of Spans
- 10.3.1 Performance of Spans
-
10.3.2
const
Correctness of Spans - 10.3.3 Using Spans as Parameters in Generic Code
-
10.4 Span Operations
- 10.4.1 Span Operations and Member Types Overview
- 10.5 Afternotes
-
10.1 Using Spans
-
11. Formatted Output
-
11.1 Formatted Output by Example
-
11.1.1 Using
std::format()
-
11.1.2 Using
std::format_to_n()
-
11.1.3 Using
std::format_to()
-
11.1.4 Using
std::formatted_size()
-
11.1.1 Using
-
11.2 Formatted Output in Detail
- 11.2.1 General Format of Format Strings
- 11.2.2 Standard Format Specifiers
- 11.2.3 Width, Precision, and Fill Characters
- 11.2.4 Format/Type Specifiers
- 11.3 Error Handling
- 11.4 Internationalization
-
11.5 User-Defined Formatted Output
- 11.5.1 Basic Formatter API
- 11.5.2 Improved Parsing
- 11.5.3 Using Standard Formatters for User-Defined Formatters
- 11.5.4 Using Standard Formatters for Strings
- 11.6 Performance of the Formatting Library
- 11.7 Afternotes
-
11.1 Formatted Output by Example
-
12. Dates and Time Zones for
<chrono>
-
12.1 Overview by Example
- 12.1.1 Schedule a Meeting on the 5th of Every Month
- 12.1.2 Schedule a Meeting Every First Monday
- 12.2 Basic Chrono Concepts and Terminology
-
12.3 Basic Chrono Extensions with C++20
- 12.3.1 Duration Types
- 12.3.2 Clocks
- 12.3.3 Timepoint Types
- 12.3.4 Calendrical Types
-
12.3.5 Time Type
hh_mm_ss
-
12.4 Time Zones
- 12.4.1 Characteristics of Time Zones
- 12.4.2 Using Time Zones
-
12.5 I/O with Chrono Types
- 12.5.1 Default Output Formats
- 12.5.2 Formatted Output
- 12.5.3 Locale Dependent Output
- 12.5.4 Formatted Input
-
12.6 Using the Chrono Extensions in Practice
- 12.6.1 Invalid Dates
-
12.6.2 Dealing with
months
andyears
- 12.6.3 Parsing Time Points and Durations
- 12.6.4 Dealing with Time Zone Abbreviations
- 12.6.5 Custom Timezones
-
12.7 Clocks in Detail
- 12.7.1 Clocks with a Specified Epoch
-
12.7.2 The Pseudo Clock
local_t
- 12.7.3 Dealing with Leap Seconds
- 12.7.4 Conversions between Clocks
- 12.7.5 Dealing with the File Clock
- 12.8 Other New Chrono Features
- 12.9 Afternotes
-
12.1 Overview by Example
-
13.
std::jthread
and Stop Tokens-
13.1 Motivation for
std::jthread
-
13.1.1 The Problem of
std::thread
-
13.1.2 Using
std::jthread
- 13.1.3 Stop Tokens and Stop Callbacks
- 13.1.4 Stop Tokens and Condition Variables
-
13.1.1 The Problem of
-
13.2 Stop Sources and Stop Tokens
- 13.2.1 Stop Sources and Stop Tokens in Detail
- 13.2.2 Using Stop Callbacks
- 13.2.3 Constraints and Guarantees of Stop Tokens
-
13.3
std::jthread
In Detail-
13.3.1 Using Stop Tokens with
std::jthread
-
13.3.1 Using Stop Tokens with
- 13.4 Afternotes
-
13.1 Motivation for
-
14. Concurrency Features
-
14.1 Thread Synchronization with Latches and Barriers
- 14.1.1 Latches
- 14.1.2 Barriers
-
14.2 Semaphores
- 14.2.1 Example of Using Counting Semaphores
- 14.2.2 Example of Using Binary Semaphores
-
14.3 Extensions Atomics
-
14.3.1 Atomic References with
std::atomic_ref<>
- 14.3.2 Atomic Shared Pointers
- 14.3.3 Atomic Floating-Point Types
- 14.3.4 Thread Synchronization with Atomic Types
-
14.3.5 Extensions for
std::atomic_flag
-
14.3.1 Atomic References with
-
14.4 Synchronized Output Streams
- 14.4.1 Motivation of Synchronized Output Streams
- 14.4.2 Using of Synchronized Output Streams
- 14.4.3 Using Synchronized Output Streams for Files
- 14.4.4 Using Synchronized Output Streams as Output Streams
- 14.4.5 Synchronized Output Streams in Practice
- 14.4.6 Synchronized Output Streams in Detail
- 14.5 Afternotes
-
14.1 Thread Synchronization with Latches and Barriers
-
15. Coroutines
- 15.1 What Are Coroutines?
-
15.2 A First Coroutine Example
- 15.2.1 Defining the Coroutine
- 15.2.2 Using the Coroutine
- 15.2.3 Lifetime Issues with Call-by-Reference
- 15.2.4 Implementing the Coroutine Interface
- 15.2.5 Bootstrapping Interface, Handle, and Promise
- 15.2.6 Memory Management
-
15.3 Coroutines That Yield or Return Values
-
15.3.1 Using
co_yield
-
15.3.2 Using
co_return
-
15.3.1 Using
-
15.4 Coroutine Awaitables and Awaiters
- 15.4.1 Awaiters
- 15.4.2 Standard Awaiters
- 15.4.3 Passing Values From Suspension Back to the Coroutine
-
15.5 Coroutines in Detail
- 15.5.1 Coroutine Constraints
- 15.5.2 The Coroutine Frame and the Promises
- 15.5.3 How Coroutine Interfaces, Promises, and Awaitables Interact
- 15.5.4 Coroutine Promises in Detail
- 15.5.5 Coroutine Handles in Detail
- 15.5.6 Allocating Memory for the Coroutine Frame
-
15.6
co_await
and Awaiters in Detail- 15.6.1 Details of the Awaiter Interface
-
15.6.2 Let
co_await
Update Running Coroutines - 15.6.3 Symmetric Transfer with Awaiters for Continuation
-
15.7
co_await
in Detail-
15.7.1
await_transform()
-
15.7.2
operator co_await()
-
15.7.1
-
15.8 Sequenced Asynchronous Coroutine Calls
-
15.8.1
co_await
Coroutines - 15.8.2 A Thread Pool for Coroutine Tasks
-
15.8.1
- 15.9 Coroutine Traits
- 15.10 Afternotes
-
16. Modules
-
16.1 Motivation of Modules by a First Example
- 16.1.1 Implementing and Exporting a Module
- 16.1.2 Compiling Module Units
- 16.1.3 Importing and Using a Module
- 16.1.4 Reachable versus Visible
- 16.1.5 Modules and Namespaces
-
16.2 Modules with Multiple Files
- 16.2.1 Module Units
- 16.2.2 Implementation Units
- 16.2.3 Internal Partitions
- 16.2.4 Interface Partitions
- 16.2.5 Summary of Splitting Modules into Different Files
-
16.3 Dealing with Modules in Practice
- 16.3.1 Dealing with Module Files with Different Compilers
- 16.3.2 Dealing with Header Files
-
16.4 Modules in Detail
- 16.4.1 Private Module Fragments
- 16.4.2 Module Declaration/Export in Detail
- 16.4.3 Umbrella Modules
- 16.4.4 Module Import in Detail
- 16.4.5 Reachable versus Visible Symbols in Detail
- 16.5 Afternotes
-
16.1 Motivation of Modules by a First Example
-
17. Lambda Extensions
-
17.1 Generic Lambdas with Template Parameters
- 17.1.1 Using Template Parameters for Generic Lambdas in Practice
- 17.1.2 Explicit Specification of Lambda Template Parameters
- 17.2 Calling the Default Constructor of Lambdas
- 17.3 Lambdas as Non-Type Template Parameters
-
17.4
consteval
Lambdas -
17.5 Changes for Capturing
-
17.5.1 Capturing
this
and*this
- 17.5.2 Capturing Structured Bindings
- 17.5.3 Capturing Parameter Packs of Variadic Templates
-
17.5.1 Capturing
- 17.6 Afternotes
-
17.1 Generic Lambdas with Template Parameters
-
18. Compile-Time Computing
-
18.1 Keyword
constinit
-
18.1.1 Using
constinit
in Practice -
18.1.2 How
constinit
Solves the Static Initialization Order Fiasco
-
18.1.1 Using
-
18.2 Keyword
consteval
-
18.2.1 A First
consteval
Example -
18.2.2
constexpr
versusconsteval
-
18.2.3 Using
consteval
in Practice - 18.2.4 Compile-Time Value versus Compile-Time Context
-
18.2.1 A First
-
18.3 Relaxed Constraints for
constexpr
Functions -
18.4
std::is_constant_evaluated()
-
18.4.1
std::is_constant_evaluated()
in Detail
-
18.4.1
-
18.5 Using Heap Memory, Vectors, and Strings at Compile Time
- 18.5.1 Using Vectors at Compile Time
- 18.5.2 Returning a Collection at Compile Time
- 18.5.3 Using Strings at Compile Time
-
18.6 Other
constexpr
Extensions-
18.6.1
constexpr
Language Extensions -
18.6.2
constexpr
Library Extensions
-
18.6.1
- 18.7 Afternotes
-
18.1 Keyword
-
19. Non-Type Template Parameter (NTTP) Extensions
-
19.1 New Types for Non-Type Template Parameters
-
19.1.1
double
Values as Non-Type Template Parameters - 19.1.2 Objects as Non-Type Template Parameters
- 19.1.3 Lambdas as Non-Type Template Parameters
-
19.1.1
- 19.2 Details of Floating-Point Values as NTTP’s
- 19.3 Details of Objects as NTTP’s
- 19.4 Afternotes
-
19.1 New Types for Non-Type Template Parameters
-
20. New Type Traits
-
- 20.0.1 Type Traits for Type Classification
-
20.0.2
is_bounded_array_v<>
andis_unbounded_array_v
- 20.0.3 Type Traits for Type Inspection
-
20.0.4
is_nothrow_convertible_v<>
- 20.0.5 Type Traits for Type Conversion
-
20.0.6
remove_cvref_t<>
-
20.0.7
unwrap_reference<>
andunwrap_ref_decay_t
-
20.0.8
common_reference<>_t
-
20.0.9
type_identity_t<>
- 20.0.10 Type Traits for iterators
-
20.0.11
iter_difference_t<>
-
20.0.12
iter_value_t<>
-
20.0.13
iter_reference_t<>
anditer_rvalue_reference_t<>
-
20.1 Type Traits for Layout Compatibility
-
20.1.1
is_layout_compatible_v<>
-
20.1.2
is_layout_pointer_interconvertible_base_of_v<>
-
20.1.1
-
20.2
is_pointer_interconvertible_with_class<>()
andis_corresponding_member<>()
- 20.3 Afternotes
-
-
21. Small Improvements for the Core Language
-
21.1 Range-Based
for
Loop with Initialization -
21.2
using
for Enumeration Values - 21.3 Delegate Enumerations Types to different Scopes
-
21.4 New Character Type
char8_t
-
21.4.1 Changes in the C++ Standard Library for
char8_t
- 21.4.2 Broken Backward Compatibility
-
21.4.1 Changes in the C++ Standard Library for
-
21.5 Improvements for Aggregates
- 21.5.1 Designated Initializers
- 21.5.2 Aggregate Initialization with Parentheses
- 21.5.3 Definition of Aggregates
-
21.6 New Attributes and Attribute Features
-
21.6.1 Attributes
[[likely]]
and[[unlikely]]
-
21.6.2 Attribute
[[no_unique_address]]
-
21.6.3 Attribute
[[nodiscard]]
with Parameter
-
21.6.1 Attributes
- 21.7 Feature Test Macros
- 21.8 Afternotes
-
21.1 Range-Based
-
22. Small Improvements for Generic Programming
-
22.1 Implicit
typename
for Type Members of Template Parameters-
22.1.1 Rules for Implicit
typename
in Detail
-
22.1.1 Rules for Implicit
-
22.2 Improvements for Aggregates in Generic Code
- 22.2.1 Class Template Argument Deduction (CTAD) for Aggregates
-
22.3 Conditional
explicit
-
22.3.1 Conditional
explicit
in the Standard Library
-
22.3.1 Conditional
- 22.4 Afternotes
-
22.1 Implicit
-
23. Small Improvements for the C++ Standard Library
-
23.1 Updates for String Types
-
23.1.1 String Members
starts_with()
andends_with()
-
23.1.2 Restricted String Member
reserve()
-
23.1.1 String Members
-
23.2
std::source_location
-
23.3 Safe Comparisons of Integrals Values and Sizes
- 23.3.1 Safe Comparisons of Integrals Values
-
23.3.2
ssize()
- 23.4 Mathematical Constants
-
23.5 Utilities to Deal with Bits
- 23.5.1 Bit Operations
-
23.5.2
std::bit_cast<>()
-
23.5.3
std::endian
-
23.6
<version>
-
23.7 Extensions for Algorithms
- 23.7.1 Range Support
- 23.7.2 New Algorithms
-
23.7.3
unseq
Execution Policy for Algorithms
- 23.8 Afternotes
-
23.1 Updates for String Types
-
24. Deprecated and Removed Features
- 24.1 Deprecated and Removed Core Language Features
-
24.2 Deprecated and Removed Library Features
- 24.2.1 Deprecated Library Features
- 24.2.2 Removed Library Features
- 24.3 Afternotes
-
25. Glossary
-
25.1 A
- 25.1.1 aggregate
- 25.1.2 argument-dependent lookup (ADL)
-
25.2 C
- 25.2.1 class template argument deduction (CTAD)
-
25.3 F
- 25.3.1 forwarding reference
- 25.3.2 full specialization
- 25.3.3 function object (functor)
-
25.4 G
- 25.4.1 glvalue
-
25.5 I
- 25.5.1 incomplete type
-
25.6 L
- 25.6.1 lvalue
-
25.7 P
- 25.7.1 partial specialization
- 25.7.2 predicate
- 25.7.3 prvalue
-
25.8 R
- 25.8.1 resource acquisition is initialization (RAII)
- 25.8.2 regular type
- 25.8.3 rvalue
-
25.9 S
- 25.9.1 semiregular type
- 25.9.2 substitution failure is not an error (SFINAE)
- 25.9.3 small/short string optimization (SSO)
- 25.9.4 stateless
- 25.9.5 standard template library (STL)
-
25.10 U
- 25.10.1 universal reference
-
25.11 V
- 25.11.1 value category
- 25.11.2 variable template
- 25.11.3 variadic template
-
25.12 X
- 25.12.1 xvalue
-
25.1 A
- Notes
The Leanpub 60-day 100% Happiness Guarantee
Within 60 days of purchase you can get a 100% refund on any Leanpub purchase, in two clicks.
See full terms
Do Well. Do Good.
Authors have earned$11,592,641writing, publishing and selling on Leanpub, earning 80% royalties while saving up to 25 million pounds of CO2 and up to 46,000 trees.
Learn more about writing on Leanpub
Free Updates. DRM Free.
If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).
Most Leanpub books are available in PDF (for computers), EPUB (for phones and tablets) and MOBI (for Kindle). The formats that a book includes are shown at the top right corner of this page.
Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.
Learn more about Leanpub's ebook formats and where to read them
Top Books
SignalR on .NET 6 - the Complete Guide
Fiodar SazanavetsLearn everything there is to learn about SignalR and how to integrate it with the latest .NET 6 and C# 10 features. Learn how to connect any type of client to SignalR, including plain WebSocket client. Learn how to build interactive applications that can communicate with each other in real time without making excessive calls.
The easiest way to learn design patterns
Fiodar SazanavetsLearn design patterns in the easiest way possible. You will no longer have to brute-force your way through each one of them while trying to figure out how it works. The book provides a unique methodology that will make your understanding of design patterns stick. It can also be used as a reference book where you can find design patterns in seconds.
C++20 - The Complete Guide
Nicolai M. JosuttisAll the new language and library features of C++20 (for those who know previous versions).
The book presents all new language and library features of C++20. Learn how this impacts day-to-day programming, to benefit in practice, to combine new features, and to avoid all new traps.
Buy early, pay less, free updates.
Other books:
Jetpack Compose internals
Jorge CastilloJetpack Compose is the future of Android UI. Master how it works internally and become a more efficient developer with it. You'll also find it valuable if you are not an Android dev. This book provides all the details to understand how the Compose compiler & runtime work, and how to create a client library using them.
Functional event-driven architecture: Powered by Scala 3
Gabriel VolpeExplore the event-driven architecture (EDA) in a purely functional way, mainly powered by Fs2 streams in Scala 3!
Leverage your functional programming skills by designing and writing stateless microservices that scale, powered by stateful message brokers.
OpenIntro Statistics
David Diez, Christopher Barr, Mine Cetinkaya-Rundel, and OpenIntroA complete foundation for Statistics, also serving as a foundation for Data Science.
Leanpub revenue supports OpenIntro (US-based nonprofit) so we can provide free desk copies to teachers interested in using OpenIntro Statistics in the classroom and expand the project to support free textbooks in other subjects.
More resources: openintro.org.
R Programming for Data Science
Roger D. PengThis book brings the fundamentals of R programming to you, using the same material developed as part of the industry-leading Johns Hopkins Data Science Specialization. The skills taught in this book will lay the foundation for you to begin your journey learning data science. Printed copies of this book are available through Lulu.
Ansible for DevOps
Jeff GeerlingAnsible is a simple, but powerful, server and configuration management tool. Learn to use Ansible effectively, whether you manage one server—or thousands.
CCIE Service Provider Version 4 Written and Lab Exam Comprehensive Guide
Nicholas RussoThe service provider landscape has changed rapidly over the past several years. Networking vendors are continuing to propose new standards, techniques, and procedures for overcoming new challenges while concurrently reducing costs and delivering new services. Cisco has recently updated the CCIE Service Provider track to reflect these changes; this book represents the author's personal journey in achieving that certification.
Cronache di Domain-Driven Design
Francesco Strazzullo, Matteo Baglini, Gianluca Padovani, Emanuele DelBono, Marco Consolaro, Alessandro Colla, Uberto Barbini, Alberto Acerbis, Julie Camosseto, DDD Open, and Alberto BrandoliniCronache di Domain-Driven Design: un libro corale in italiano fatto di storie indipendenti tra loro, che sono il risultato dell’applicazione di Domain-Driven Design su progetti reali.
Top Bundles
- #1
Practical FP in Scala + Functional event-driven architecture
2 Books
Practical FP in Scala (A hands-on approach) & Functional event-driven architecture, aka FEDA, (Powered by Scala 3), together as a bundle! The content of PFP in Scala is a requirement to understand FEDA so why not take advantage of this bundle!? - #2
Software Architecture for Developers: Volumes 1 & 2 - Technical leadership and communication
2 Books
"Software Architecture for Developers" is a practical and pragmatic guide to modern, lightweight software architecture, specifically aimed at developers. You'll learn:The essence of software architecture.Why the software architecture role should include coding, coaching and collaboration.The things that you really need to think about before... - #3
All the Books of The Medical Futurist
6 Books
We put together the most popular books from The Medical Futurist to provide a clear picture about the major trends shaping the future of medicine and healthcare. Digital health technologies, artificial intelligence, the future of 20 medical specialties, big pharma, data privacy, digital health investments and how technology giants such as Amazon... - #4
CCIE Service Provider Ultimate Study Bundle
2 Books
Piotr Jablonski, Lukasz Bromirski, and Nick Russo have joined forces to deliver the only CCIE Service Provider training resource you'll ever need. This bundle contains a detailed and challenging collection of workbook labs, plus an extensively detailed technical reference guide. All of us have earned the CCIE Service Provider certification... - #6
Pattern-Oriented Memory Forensics and Malware Detection
2 Books
This training bundle for security engineers and researchers, malware and memory forensics analysts includes two accelerated training courses for Windows memory dump analysis using WinDbg. It is also useful for technical support and escalation engineers who analyze memory dumps from complex software environments and need to check for possible... - #7
Modern C++ Collection
3 Books
Get All about Modern C++C++ Standard Library, including C++20Concurrency with Modern C++, including C++20C++20Each book has about 200 complete code examples. Updates are included. When I update one of the books, you immediately get the updated bundle. You can expect significant updates to each new C++ standard (C++23, C++26, .. ) and also... - #10
Growing Agile: The Complete Coach's Guide
7 Books
Growing Agile: Coach's Guide Series This bundle provides a collection of training and workshop plans for a variety of agile topics. The series is aimed at agile coaches, trainers and ScrumMasters who often find themselves needing to help teams understand agile concepts. Each book in the series provides the plans, slides, handouts and activity...