Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 Technical overview  



1.1  Function templates  



1.1.1  Abbreviated function templates  







1.2  Class templates  





1.3  Variable templates  





1.4  Non-type template parameters  





1.5  Template specialization  





1.6  Explicit template specialization  





1.7  Variadic templates  





1.8  Template aliases  







2 Generic programming features in other languages  





3 See also  





4 References  





5 External links  














Template (C++)






العربية
Deutsch
Esperanto
فارسی
Français

Hrvatski

Norsk bokmål
Polski
Română
Русский
Українська

 

Edit links
 









Article
Talk
 

















Read
Edit
View history
 








Tools
   


Actions  



Read
Edit
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Cite this page
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 




In other projects  



Wikibooks
 
















Appearance
   

 






From Wikipedia, the free encyclopedia
 

(Redirected from Template (programming))

Templates are a feature of the C++ programming language that allows functions and classes to operate with generic types. This allows a function or class declaration to reference via a generic variable another different class (built-in or newly declared data type) without creating full declaration for each of these different classes.

In plain terms, a templated class or function would be the equivalent of (before "compiling") copying and pasting the templated block of code where it is used, and then replacing the template parameter with the actual one. For this reason, classes employing templated methods place the implementation in the headers (*.h files) as no symbol could be compiled without knowing the type beforehand.

The C++ Standard Library provides many useful functions within a framework of connected templates.

Major inspirations for C++ templates were the parameterized modules provided by the language CLU and the generics provided by Ada.[1]

Technical overview[edit]

There are three kinds of templates: function templates, class templates and, since C++14, variable templates. Since C++11, templates may be either variadic or non-variadic; in earlier versions of C++ they are always non-variadic.

Function templates[edit]

Afunction template behaves like a function except that the template can have arguments of many different types (see example). In other words, a function template represents a family of functions. The format for declaring function templates with type parameters is:

template<class identifier> declaration;
template<typename identifier> declaration;

Both expressions have the same meaning and behave in exactly the same way. The latter form was introduced to avoid confusion,[2] since a type parameter need not be a class until C++20. (It can be a basic type such as intordouble.)

For example, the C++ Standard Library contains the function template max(x, y) which returns the larger of x and y. That function template could be defined like this:

template<typename T> T max(T &a, T &b) { return a > b ? a : b; }

This single function definition works with many data types. Specifically, it works with all data types for which > (the greater-than operator) is defined. The usage of a function template saves space in the source code file in addition to limiting changes to one function description and making the code easier to read.

A template does not produce smaller object code, though, compared to writing separate functions for all the different data types used in a specific program. For example, if a program uses both an int and a double version of the max() function template shown above, the compiler will create an object code version of max() that operates on int arguments and another object code version that operates on double arguments. The compiler output will be identical to what would have been produced if the source code had contained two separate non-templated versions of max(), one written to handle int and one written to handle double.

Here is how the function template could be used:

#include <iostream>

int main() {
    // This will call max<int> by implicit argument deduction.
    std::cout << max(3, 7) << '\n';

    // This will call max<double> by implicit argument deduction.
    std::cout << max(3.0, 7.0) << '\n';

    // We need to explicitly specify the type of the arguments; 
    // although std::type_identity could solve this problem...
    std::cout << max<double>(3, 7.0) << '\n';
}

In the first two cases, the template argument T is automatically deduced by the compiler to be int and double, respectively. In the third case automatic deduction of max(3, 7.0) would fail because the type of the parameters must in general match the template arguments exactly. Therefore, we explicitly instantiate the double version with max<double>().

This function template can be instantiated with any copy-constructible type for which the expression y > x is valid. For user-defined types, this implies that the greater-than operator (>) must be overloaded in the type.

Abbreviated function templates[edit]

Since C++20, using autoorConcept auto in any of the parameters of a function declaration, that declaration becomes an abbreviated function template declaration.[3] Such a declaration declares a function template and one invented template parameter for each placeholder is appended to the template parameter list:

void f1(auto); // same as template<class T> void f1(T)
void f2(C1 auto); // same as template<C1 T> void f2(T), if C1 is a concept
void f3(C2 auto...); // same as template<C2... Ts> void f3(Ts...), if C2 is a concept
void f4(C2 auto, ...); // same as template<C2 T> void f4(T...), if C2 is a concept
void f5(const C3 auto*, C4 auto&); // same as template<C3 T, C4 U> void f5(const T*, U&);

Class templates[edit]

A class template provides a specification for generating classes based on parameters. Class templates are generally used to implement containers. A class template is instantiated by passing a given set of types to it as template arguments.[4] The C++ Standard Library contains many class templates, in particular the containers adapted from the Standard Template Library, such as vector.

Variable templates[edit]

In C++14, templates can be also used for variables, as in the following example:

template<typename T> 
constexpr T pi = T{3.141592653589793238462643383L}; // (Almost) from std::numbers::pi

Non-type template parameters[edit]

Although templating on types, as in the examples above, is the most common form of templating in C++, it is also possible to template on values. Thus, for example, a class declared with

template <int K>
class MyClass;

can be instantiated with a specific int.

As a real-world example, the standard library fixed-size array type std::array is templated on both a type (representing the type of object that the array holds) and a number which is of type std::size_t (representing the number of elements the array holds). std::array can be declared as follows:

template<class T, size_t N> struct array;

and an array of six chars might be declared:

array<char, 6> myArray;

Template specialization[edit]

When a function or class is instantiated from a template, a specialization of that template is created by the compiler for the set of arguments used, and the specialization is referred to as being a generated specialization.

Explicit template specialization[edit]

Sometimes, the programmer may decide to implement a special version of a function (or class) for a given set of template type arguments which is called an explicit specialization. In this way certain template types can have a specialized implementation that is optimized for the type or a more meaningful implementation than the generic implementation.

Explicit specialization is used when the behavior of a function or class for particular choices of the template parameters must deviate from the generic behavior: that is, from the code generated by the main template, or templates. For example, the template definition below defines a specific implementation of max() for arguments of type const char*:

#include <cstring>

template<> 
const char* max(const char* a, const char* b) {
    // Normally, the result of a direct comparison
    // between two C strings is undefined behaviour;
    // using std::strcmp makes defined.
    return std::strcmp(a, b) > 0 ? a : b;
}

Variadic templates[edit]

C++11 introduced variadic templates, which can take a variable number of arguments in a manner somewhat similar to variadic functions such as std::printf.

Template aliases[edit]

C++11 introduced template aliases, which act like parameterized typedefs.

The following code shows the definition of a template alias StrMap. This allows, for example, StrMap<int> to be used as shorthand for std::unordered_map<int,std::string>.

template<typename T> using StrMap = std::unordered_map<T, std::string>;

Generic programming features in other languages[edit]

Initially, the concept of templates was not included in some languages, such as Java and C# 1.0. Java's adoption of generics mimics the behavior of templates, but is technically different. C# added generics (parameterized types) in .NET 2.0. The generics in Ada predate C++ templates.

Although C++ templates, Java generics, and .NET generics are often considered similar, generics only mimic the basic behavior of C++ templates.[5] Some of the advanced template features utilized by libraries such as Boost and STLSoft, and implementations of the STL, for template metaprogramming (explicit or partial specialization, default template arguments, template non-type arguments, template template arguments, ...) are unavailable with generics.

In C++ templates, compile-time cases were historically performed by pattern matching over the template arguments. For example, the template base class in the Factorial example below is implemented by matching 0 rather than with an inequality test, which was previously unavailable. However, the arrival in C++11 of standard library features such as std::conditional has provided another, more flexible way to handle conditional template instantiation.

// Induction

template<unsigned N> 
struct Factorial {
  static constexpr unsigned value = N * Factorial<N - 1>::value;
};

// Base case via template specialization:

template<> struct Factorial<0> {
  static constexpr unsigned value = 1;
};

With these definitions, one can compute, say 6! at compile time using the expression Factorial<6>::value. Alternatively, constexpr in C++11 / consteval in C++20 can be used to calculate such values directly using a function at compile-time. Because of this, template meta-programming is now mostly used to do operations on types.

See also[edit]

References[edit]

  1. ^ Stroustrup, Bjarne (8 September 2004). "The C++ Programming Language". Stroustrup.com (personal homepage) (3rd, Special ed.).
  • ^ Lippman, Stan (11 August 2004). "Why C++ Supports both Class and Typename for Type Parameters". Microsoft Developers Network (MSDN).
  • ^ "P1141R1 - Yet another approach for constrained declarations". Archived from the original on 2018-11-11. Retrieved 2018-11-11.
  • ^ Vandevoorde, Daveed; Josuttis, Nicolai (2002). C++ Templates: The Complete Guide. Addison Wesley. ISBN 978-0-201-73484-3.
  • ^ "Differences Between C++ Templates and C# Generics (C# Programming Guide)". 12 March 2024.
  • External links[edit]


    Retrieved from "https://en.wikipedia.org/w/index.php?title=Template_(C%2B%2B)&oldid=1217445430"

    Categories: 
    Generic programming
    Metaprogramming
    C++
    Hidden categories: 
    Articles with short description
    Short description matches Wikidata
    Wikipedia articles in need of updating from August 2021
    All Wikipedia articles in need of updating
    Articles needing additional references from January 2009
    All articles needing additional references
    Articles lacking in-text citations from May 2009
    All articles lacking in-text citations
    Wikipedia neutral point of view disputes from March 2024
    All Wikipedia neutral point of view disputes
    Coatrack articles
    Articles with multiple maintenance issues
    Articles with example C++ code
     



    This page was last edited on 5 April 2024, at 21:33 (UTC).

    Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Mobile view



    Wikimedia Foundation
    Powered by MediaWiki