Templates
A template is a C++ entity that defines one of the following:
- a family of classes (class template), which may be nested classes
- a family of functions (function template), which may be member functions
- an alias to a family of types (alias template) (since C++11)
- a family of variables (variable template) (since C++14)
Templates are parametrized by one or more template parameters, of three kinds: type template parameters, non-type template parameters, and template template parameters.
When template arguments are provided or, for function and class (since C++17) templates only, deduced, they are substituted for the template parameters to obtain a specialization of the template, that is, a specific type or a specific function lvalue. Specializations may also be provided explicitly: full specializations are allowed for both class and function templates, partial specializations are only allowed for class templates.
When a class template specialization is referenced in context that requires a complete object type, or when a function template specialization is referenced in context that requires a function definition to exist, the template is instantiated (the code for it is actually compiled), unless the template was already explicitly specialized or explicitly instantiated. Instantiation of a class template doesn't instantiate any of its member functions unless they are also used. At link time, identical instantiations generated by different translation units are merged.
The definition of a template must be visible at the point of implicit instantiation, which is why template libraries typically provide all template definitions in the headers (e.g. most boost libraries are header-only)
Syntax
template < parameter-list > declaration
|
(1) | ||||||||
export template < parameter-list > declaration
|
(2) | (until C++11) | |||||||
declaration | - | declaration of a class (including struct and union), a member class or member enumeration type, a function or member function, a static data member at namespace scope, a variable or static data member at class scope, (since C++14) or an alias template (since C++11) It may also define a template specialization. |
parameter-list | - | a non-empty comma-separated list of the template parameters, each of which is either non-type parameter, a type parameter, a template parameter, or a parameter pack of any of those. |
export was an optional modifier which declared the template as exported (when used with a class template, it declared all of its members exported as well). Files that instantiated exported templates did not need to include their definitions: the declaration was sufficient. Implementations of export were rare and disagreed with each other on details.
|
(until C++11) |
This section is incomplete Reason: core syntax, template parameters, and instantiations, take content common between class_template and function_template |
Templated entity
Besides class/function/variable templates themselves, various entities defined within a template are never considered to be entities that can be separately instantiated (this in turn includes default arguments, exception-specifications, non-static data member initializers, etc, of those entities). As a result, these non-template entities undergo template instantiation: the dependent names are looked up, the semantic constraints are checked, and any templates used are instantiated as part of the instantiation of the template within which this entity is declared. Together with templates, such entities are known as "templated entities" (or, in some sources, "temploids")
All of the following are templated entities:
- a class/function/variable template
- a member of a templated entity (such as a non-template member function of a class template)
- an enumerator of an enumeration that is a templated entity
- any entity defined or created within a templated entity: a local class, a local variable, a friend function, etc
- the closure type of a lambda expression that appears in the declaration of a templated entity