And the Winner is: Templates
This post is a cross-post from my blog ModernesCpp.com.
The future of C++ speaks templates, and so does my blog Modernes C++. Based on the poll of my last post "Quo Vadis - Modernes C++", my next presumably 50 - 100 posts explain the details to templates. In this post, I want to give you an idea of the upcoming posts.
Let me first write a few words about the poll because its result surprised me in two ways.
The Poll
First, about 400 people voted in the poll. This is a number I would not have expected. Thanks for the many votes.
Second, I assumed that "C++23" will probably win the poll, followed by "Templates" or "Extending and embedding Python with C/C++". My assumption was so wrong. I'm happy that I made the poll.
When I'm done with this "Templates", I make the next poll. Now, let's tear the wheel to templates.
Templates
First of all: What are templates? Templates (class templates or function templates) are families of classes or functions.
Before I present my plan, I want to encourage you to write me an e-mail if I forgot a template-related feature you are interested in. Here is my e-mail address: [email protected].
These are the upcoming topics with a few additional words:
Basics
Of course, my tour starts with the basics.
- Presenting the instantiation of function templates provides you the first intuition about templates. This holds in particular if function overloading, or explicit template arguments are given.
- In contrast to function templates, only the C++17-compiler can deduce the template arguments for class templates. Meaning, before C++17, you have to specify the template arguments such as int in std::vector<int>.
- Template parameters can be types, non-types, and templates. In particular, floating-point values can be used in C++20 as non-type template parameters.
- The compiler can automatically deduce the template arguments of templates. It makes a big difference if the template parameter is a reference/pointer, a universal reference (&&), or a value. Templates can also have default template arguments.
- Class templates allow partial and full template specialization, function template only full template specialization.
Details
After the basics, I want to provide you more details.
- In general, template instantiation happens implicitly but can also be done explicitly.
- A variadic template is a template that can have an arbitrary number of parameters. Hence, templates can take an arbitrary number of arguments of any value category.
- Based on variadic templates in C++11, we got fold expressions in C++17. Fold expressions reduce parameter packs on binary operators.
- Friendship of templates is special. A class or class template can grand general friendship to each instance of a class template or function template. The friendship can also be granted to specific instances of a class template or function template, and also to a specific type.
- Names can be dependent on template parameters. For dependent names, you have to help the compiler to decide if the name is a type, a non-type, or a template. If ambiguous, the compiler assumes that a name is a non-type.
Techniques
There are many techniques and features related to templates and template instantiation.
- When you use a function template with at least two template parameters, you cannot decide in general, what should be the return type of the function template. Here, the automatic return type comes to our rescue.
- Template metaprogramming is turning complete. This means all that is calculable can be calculated at compile time. Template metaprogramming is a pure functional language embedded into the imperative language C++. Libraries such as many of the boost libraries use heavily template metaprogramming.
- The type traits library is applied template metaprogramming. Thanks to the type traits library, you can perform type checks, type comparisons, and type modifications at compile time.
- constexpr is the convenients way to program at compile time. In contrast to programming in a functional style using template metaprogramming, you can program with constexpr in an imperative style.
- constexpr if enables it to compile source code conditionally.
Design
Templates open C++ to new ways to design software.
- Beside dynamic polymorphism (object orientation), we have static polymorphism (templates).
- CRTP (curiously recurring template pattern) is a mind-blowing but very powerful technique. Thanks to CRTP, we can move the virtuality from run time to compile time.
- Expression templates create structures, which stand for calculations. They are only evaluated when needed and spare, therefore, time and memory.
- There are many idioms and patterns related to templates. For example, we have policies and traits, tag dispatching, and type erasure.
C++20
- Concepts are an extension to the templates feature provided by the C++ programming language. Concepts are named Boolean predicates on template parameters, evaluated at compile time. A concept may be associated with a template (class template, function template, or member function of a class template), in which case it serves as a constraint: it limits the set of arguments that are accepted as template parameters.(Wikipedia)
What's next?
In my next post, I introduce function templates using the online compiler C++ Insights.
Thanks a lot to my Patreon Supporters: Matt Braun, Roman Postanciuc, Tobias Zindl, Marko, G Prvulovic, Reinhold Dr?ge, Abernitzke, Frank Grimm, Sakib, Broeserl, António Pina, Sergey Agafyin, Андрей Бурмистров, Jake, GS, Lawton Shoemake, Animus24, Jozo Leko, John Breland, espkk, Wolfgang G?rtner, Louis St-Amour, Stephan Roslen, Venkat Nandam, Jose Francisco, Douglas Tinkham, Kuchlong Kuchlong, Robert Blanch, Truels Wissneth, Kris Kafka, Mario Luoni, Neil Wang, Friedrich Huber, lennonli, Pramod Tikare Muralidhara, Peter Ware, Tobi Heideman, Daniel Hufschl?ger, Red Trip, Alexander Schwarz, Tornike Porchxidze, and Alessandro Pezzato.
Thanks in particular to Jon Hess, Lakshman, Christian Wittenhorst, Sherhy Pyton, Dendi Suhubdy, Sudhakar Belagurusamy, and Richard Sargeant.
My special thanks to Embarcadero
Seminars
I'm happy to give online-seminars or face-to-face seminars world-wide. Please call me if you have any questions.
Bookable (Online)
German
- Clean Code mit modernem C++: 22.06.2021 - 24.06.2021
- C++20: 10.08.2021 - 12.08.2021
- Embedded Programmierung mit modernem C++: 21.09.2021 - 23.09.2021
Standard Seminars (English/German)
Here is a compilation of my standard seminars. These seminars are only meant to give you a first orientation.
- C++ - The Core Language
- C++ - The Standard Library
- C++ - Compact
- C++11 and C++14
- Concurrency with Modern C++
- Design Patterns and Architecture Patterns with C++
- Embedded Programming with Modern C++
- Generic Programming (Templates) with C++
New
Contact Me
- Phone: +49 152 31965939
- Mail: [email protected]
- German Seminar Page: www.ModernesCpp.de
- English Seminar Page: www.ModernesCpp.net
Scientist - one lab-accident away from being a super-villain
3 年Rainer, do you already have some good references where to look if I'd like to extend my Python Scripts with Odins ridicoulusly efficient Algorithms written in C++ without using IPC (Unix Sockets etc)?
Software Engineer at Motional
3 年Since you're asking, I'll also write in: professional benchmarking techniques for C++! :)
Entrepreneur, Leader, Architect, Full-Stack Extreme Virtuoso: Business Analysis, Cyber Security, Data Science. ITIL BPM SLM Expert bringing Modern Approaches to drive Business Processes.
3 年Great Rainer and thank you for sharing - maybe include Template Meta-Programming? :)