变量模板定义一系列变量或静态数据成员。
语法:
template < 参数列表 > 变量声明 | |||||||||
变量声明 | - | 变量的声明。声明的变量名称成为模板名称。 |
参数列表 | - | 模板参数的非空逗号分隔列表,其中每个参数都是非类型参数、类型参数、模板参数或其中任何一个的 参数包。 |
解释
从变量模板实例化的变量称为实例化变量。从静态数据成员模板实例化的静态数据成员称为实例化静态数据成员。
变量模板可以通过命名空间范围内的模板声明来引入,其中变量声明声明变量。
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