Шаблон переменной (с C++14)
Шаблон переменной определяет семейство переменных или статических данных-членов.
Синтаксис
template < список_параметров > объявление_переменной |
| объявление_переменной | - | объявление переменной. Название объявленной переменной становится именем шаблона. |
| список_параметров | - | непустой список параметров, разделенных запятыми, каждый из которых является либо параметром без типа, либо параметром типа, либо параметром шаблона, либо параметром-упаковкой (parameter pack) любого из них. |
Объяснение
Переменная, созданная из шаблона переменной, называется инстанцированной переменной. Статический член данных, созданный из шаблона статического члена данных, называется инстанцированным статическим членом данных.
Шаблон переменной может быть введен объявлением шаблона в области видимости пространства имен, где объявление_переменной объявляет переменную.
template<class T>
constexpr T pi = T(3.1415926535897932385L); // variable template
template<class T>
T circular_area(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}При использовании в области видимости класса шаблон переменной объявляет шаблон статического члена данных.
using namespace std::literals;
struct matrix_constants
{
template<class T>
using pauli = hermitian_matrix<T, 2>; // alias template
template<class T> // static data member template
static constexpr pauli<T> sigmaX = {{0, 1}, {1, 0}};
template<class T>
static constexpr pauli<T> sigmaY = {{0, -1i}, {1i, 0}};
template<class T>
static constexpr pauli<T> sigmaZ = {{1, 0}, {0, -1}};
};Как и другие статические члены, может потребоваться определение шаблона статического члена данных. Такое определение предоставляется вне определения класса. Объявление шаблона статического члена данных в области видимости пространства имен также может быть определением нешаблонного члена данных класса-шаблона:
struct limits
{
template<typename T>
static const T min; // declaration of a static data member template
};
template<typename T>
const T limits::min = { }; // definition of a static data member template
template<class T>
class X
{
static T s; // declaration of a non-template static data member of a class template
};
template<class T>
T X<T>::s = 0; // definition of a non-template data member of a class templateЕсли шаблон переменной не был явным образом специализирован или явным образом инстанцирован, он неявно инстанцируется, когда специализация шаблона переменной упоминается в контексте, требующем существования определения переменной, или если существование определения влияет на семантику программы, т. е. если переменная необходима для вычисления константного выражения выражением (определение может не использоваться).
Существование определения переменной считается влияющим на семантику программы, если переменная необходима для вычисления константного выражения выражением, даже если вычисление константного выражения не требуется или если вычисление константного выражения не использует определение.
Примечания
До появления шаблонов переменных в C++14 параметризованные переменные обычно реализовывались как статические члены данных шаблонов классов или как шаблоны функций constexpr, возвращающие требуемые значения.
Шаблоны переменных не могут использоваться как параметры шаблона шаблона.
| Макрос проверки функций | Значение | Std | Функция |
|---|---|---|---|
__cpp_variable_templates | 201304L | (C++14) | Шаблоны переменных |
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение при публикации | Корректное поведение |
|---|---|---|---|
| CWG 2255 | C++14 | не было ясно, является ли специализация шаблона статического члена данных статическим членом данных | является |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/variable_template