类模板是一个基于一个或多个模板参数定义一系列类的模板。函数模板是一个基于一个或多个模板参数定义一系列函数的模板。 vector
是一个模板类; vector<int>
是从该模板实例化的特定类。
可变模板因此是一个模板,它定义了一系列变量的,基于一个或更多个模板参数:
template<typename T>
T variable_name{};
即是可变模板。您可以指定您想要的模板,就像其他任何模板一样:variable_name<int>
将是int
。 variable_name
是模板; variable_name<int>
实际上是一个变量。当然
,你可以做更复杂的事情:
template<typename T>
vector<T> vector_var{};
vector_var<int>
是vector<int>
。
变量模板只能在名称空间/全局作用域和类的静态成员中引入。在命名空间/全局范围内,它们通常被声明为constexpr
(和/或在C++ 17,inline
中)。他们制作的常量有用:
template<typename T>
inline constexpr bool is_default_constructible_v = std::is_default_constructible<T>::value;
所以,如果你想告诉如果事情是缺省构造的,你不需要略显尴尬::value
语法。
变量模板是一个C++ 14功能,这就是为什么您的编译器可能会警告您在C++ 11模式下使用它们的原因。
image<T> *im = new image<T>(w, h, false);
这是不是变量模板。这是一个常规变量,其类型非常清晰:image<T>
。只有一个变量名为“im
”。你不使用im<T>
来获得一个变量。
该声明没有定义变量族。你有什么是函数的家庭,其中他们每个人包含一个变量称为im
。函数是这里的模板,而不是变量。
这里你去:[变量模板](http://en.cppreference.com/w/cpp/language/variable_template)。使用[cppreference。COM](http://en.cppreference.com/w/)。 – Ron
我也看到了这个网站,并没有觉得它特别有用。它给出了“一个变量模板定义了一系列变量或静态数据成员。”和几个例子。我的例子中的代码对我来说似乎是基于cppreference定义中有限信息的另一个示例。为什么不是? – Scott
这看起来不像可变模板,更像是一个成员函数模板。 – VTT