究竟什么是变量模板

Sco*_*ott 2 c++ templates c++11 c++14

我收到关于变量模板的c ++ 11警告.我不完全确定我需要它们,因为我不完全确定它们是什么. 我发现的参考文献在使用它之前不需要定义术语.我的直接想法是,它是一个尝试声明一个模板化类型的变量T,但这段代码编译得很好:

template <class T>
image<T> *image<T>::copy() const {
  image<T> *im = new image<T>(w, h, false);
  memcpy(im->data, data, w * h * sizeof(T));
  return im;
}
Run Code Online (Sandbox Code Playgroud)

什么是变量模板的完整定义,为什么它没有变量模板问题

Nic*_*las 7

类模板是基于一个或多个模板参数定义一系列类的模板.函数模板是基于一个或多个模板参数定义一系列函数的模板.vector是一个模板类; vector<int>是从该模板实例化的特定类.

因此,变量模板是一个模板,它根据一个或多个模板参数定义一系列变量:

template<typename T>
T variable_name{};
Run Code Online (Sandbox Code Playgroud)

这是一个可变模板.您可以像任何其他模板一样指定您想要的那个:variable_name<int>将是类型int.variable_name是一个模板 ; variable_name<int>实际上是一个变量.

当然,你可以做更复杂的事情:

template<typename T>
vector<T> vector_var{};
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

因此,如果您想知道某些内容是否是默认构造的,那么您不需要稍微笨拙的::value语法.

变量模板是C++ 14的一个特性,这就是为什么你的编译器可能会警告你在C++ 11模式下使用它们的原因.


image<T> *im = new image<T>(w, h, false);
Run Code Online (Sandbox Code Playgroud)

不是变量模板.这是一个常规变量,其类型定义非常明确:image<T>.只有一个名为" im"的变量.您不用im<T>来获取变量.

该陈述没有定义一系列变量.你拥有的是一系列函数,其中每个函数包含一个名为的变量im.该函数是此处的模板,而不是变量.