And The Winner is: Templates
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 of templates. I want to give you an idea of the upcoming posts in this post.
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” would 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 finish these “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: Rainer.Grimm@modernescpp.de.
Modernes C++ Mentoring
Do you want to stay informed: Subscribe.
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 with 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
instd::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, and function templates only full template specialization.
Details
After the basics, I want to provide you with 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 arbitrary 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.
- The friendship of templates is special. A class or class template can grant a general friendship to each class or function template instance. The friendship can also be granted to specific instances of a class or function template and 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 turing 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 heavy template metaprogramming.
- The type traits library is applied to template metaprogramming. Thanks to the type traits library, you can perform type checks, type comparisons, and type modifications at compile time.
constexpr
is the convenient way to program at compile time. In contrast to programming in a functional style using template metaprogramming, you can programconstexpr
in an imperative style.- constexpr if enables it to compile source code conditionally.
Design
Templates open C++ to new ways to design software.
- Besides dynamic polymorphism (object orientation), we have static polymorphism (templates).
- CRTP (curiously recurring template pattern) is a mind-blowing but potent 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 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, and 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 accepted as template parameters. (Wikipedia)
What’s next?
My next post introduces function templates using the online compiler C++ Insights.
Thanks a lot to my Patreon Supporters: Matt Braun, Roman Postanciuc, Tobias Zindl, G Prvulovic, Reinhold Dröge, Abernitzke, Frank Grimm, Sakib, Broeserl, António Pina, Sergey Agafyin, Андрей Бурмистров, Jake, GS, Lawton Shoemake, Jozo Leko, John Breland, Venkat Nandam, Jose Francisco, Douglas Tinkham, Kuchlong Kuchlong, Robert Blanch, Truels Wissneth, Mario Luoni, Friedrich Huber, lennonli, Pramod Tikare Muralidhara, Peter Ware, Daniel Hufschläger, Alessandro Pezzato, Bob Perry, Satish Vangipuram, Andi Ireland, Richard Ohnemus, Michael Dunsky, Leo Goodstadt, John Wiederhirn, Yacob Cohen-Arazi, Florian Tischler, Robin Furness, Michael Young, Holger Detering, Bernd Mühlhaus, Stephen Kelley, Kyle Dean, Tusar Palauri, Juan Dent, George Liao, Daniel Ceperley, Jon T Hess, Stephen Totten, Wolfgang Fütterer, Matthias Grün, Phillip Diekmann, Ben Atakora, Ann Shatoff, Rob North, Bhavith C Achar, Marco Parri Empoli, Philipp Lenk, Charles-Jianye Chen, Keith Jeffery, Matt Godbolt, and Honey Sukesan.
Thanks, in particular, to Jon Hess, Lakshman, Christian Wittenhorst, Sherhy Pyton, Dendi Suhubdy, Sudhakar Belagurusamy, Richard Sargeant, Rusty Fleming, John Nebel, Mipko, Alicja Kaminska, Slavko Radman, and David Poole.
My special thanks to Embarcadero | |
My special thanks to PVS-Studio | |
My special thanks to Tipi.build | |
My special thanks to Take Up Code | |
My special thanks to SHAVEDYAKS |
Modernes C++ GmbH
Modernes C++ Mentoring (English)
Rainer Grimm
Yalovastraße 20
72108 Rottenburg
Mail: schulung@ModernesCpp.de
Mentoring: www.ModernesCpp.org
Modernes C++ Mentoring,
Leave a Reply
Want to join the discussion?Feel free to contribute!