Plantilla de variable(desde C++14)
Una plantilla de variable define una familia de variables o datos miembro estáticos.
Contenido |
[editar]Sintaxis
template < lista-de-parámetros> declaración-de-variable | (1) | ||||||||
template < lista-de-parámetros> requires restriccióndeclaración-de-variable | (2) | (desde C++20) | |||||||
declaración-de-variable | - | Una declaración de una variable. El nombre de la variable declarada se vuelve un nombre de plantilla. |
lista-de-parámetros | - | Una lista no vacía separada por comas de los parámetros de plantilla, cada uno de los cuales es o bien un parámetro de no-tipo, un parámetro de tipo, un parámetro de plantilla, o un paquete de parámetros de cualquiera de esos. |
restricción | - | Una expresión de restricción que restringe los parámetros de plantilla aceptados por esta plantilla de variable. |
[editar]Explicación
Una variable instanciada de una plantilla de variable se llama una variable instanciada. Un dato miembro estático instanciado de una plantilla de dato miembro estático se llama un dato miembro estático instanciado.
Una plantilla de variable puede introducirse mediante una declaración de plantilla en el ámbito del espacio de nombres, donde la declaración-de-variable declara una variable.
template<class T>constexpr T pi = T(3.1415926535897932385L);// plantilla de variable template<class T> T area_circular(T r)// plantilla de función{return pi<T>* r * r;// pi<T> es una instanciación de una plantilla de variable}
Cuando se usa en el ámbito de una clase, una plantilla de variable declara una plantilla de dato miembro estático.
usingnamespace std::literals;struct matrix_constants {template<class T>using pauli = hermitian_matrix<T, 2>;// alias de plantilla template<class T>// plantilla de dato miembro estáticostaticconstexpr pauli<T> sigmaX ={{0, 1}, {1, 0}}; template<class T>staticconstexpr pauli<T> sigmaY ={{0, -1i}, {1i, 0}}; template<class T>staticconstexpr pauli<T> sigmaZ ={{1, 0}, {0, -1}};};
Al igual que otros miembros estáticos, puede requerirse una definición de una plantilla de dato miembro estático. Tal definición se proporciona fuera de la definición de la clase. Una declaración de plantilla de dato miembro estático en el ámbito del espacio de nombres también puede ser una definición de un dato miembro de no-plantilla de una plantilla de clase:
struct limits {template<typename T>staticconst T min;// declaración de una plantilla de dato miembro estático}; template<typename T>const T limits::min={};// definición de una plantilla de dato miembro estático template<class T>class X {static T s;// declaración de un dato miembro no estático, no-plantilla,// de una plantilla de clase}; template<class T> T X<T>::s=0;// definición de un dato miembro de una plantilla de clase
A menos que una plantilla de variable haya sido explícitamente especializada o instanciada explícitamente, se instancia implícitamente cuando se hace referencia a una especialización de la plantilla de variable en un contexto que requiere que exista una definición de variable o si la existencia de la definición afecta la semántica del programa, es decir, si la variable es necesaria para la evaluación constante por una expresión (la definición puede no usarse).
Se considera que la existencia de una definición de una variable afecta la semántica del programa si la variable es necesaria para la evaluación constante por una expresión, incluso si no se requiere la evaluación constante de la expresión o si la evaluación de la expresión constante no usa la definición.
[editar]Notas
Hasta que se introdujeron las plantillas de variables en C++14, las variables parametrizadas se implementaban normalmente como datos miembro estáticos de plantillas de clase o como plantillas de función constexpr que devolvían los valores deseados.
Las plantillas de variable no se pueden utilizar como argumentos de plantilla de plantilla.
Macro de prueba de característica | Valor | Estándar | Comentario |
---|---|---|---|
__cpp_variable_templates | 201304L | (C++14) | Plantillas de variable |
[editar]Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
CWG 2255 | C++14 | No estaba claro si una especialización de una plantilla dato miembro estático es un dato miembro estático. | Lo está. |