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.


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 D 6 P2 500x500Modernes C++ Mentoring

Be part of my mentoring programs:

  • "Fundamentals for C++ Professionals" (open)
  • "Design Patterns and Architectural Patterns with C++" (open)
  • "C++20: Get the Details" (open)
  • "Concurrency with Modern C++" (starts March 2024)
  • Do you want to stay informed: Subscribe.


    These are the upcoming topics with a few additional words:


    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 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, and function templates only full template specialization.


    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.


    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 program  constexpr in an imperative style.
    • constexpr if enables it to compile source code conditionally.


    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.


    • 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, Kris Kafka, 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, moon, Philipp Lenk, Hobsbawm, Charles-Jianye Chen, and Keith Jeffery.

    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 
    My special thanks to Take Up Code
    My special thanks to SHAVEDYAKS


    I’m happy to give online seminars or face-to-face seminars worldwide. Please call me if you have any questions.

    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 Pattern and Architectural Pattern with C++
    • Embedded Programming with Modern C++
    • Generic Programming (Templates) with C++
    • Clean Code with Modern C++
    • C++20

    Online Seminars (German)

    Contact Me

    Modernes C++ Mentoring,



    0 replies

    Leave a Reply

    Want to join the discussion?
    Feel free to contribute!

    Leave a Reply

    Your email address will not be published. Required fields are marked *