究竟什么是变量模板

时间:2017-09-04 16:20:53

标签: c++ c++11 templates c++14

我收到有关变量模板的c ++ 11警告。我不完全确定我需要它们,因为我不完全确定它们是什么。 References that I've found在使用之前不要先定义术语。我的直接想法是,它试图声明一个模板化类型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;
}

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

1 个答案:

答案 0 :(得分:7)

类模板是一个模板,它根据一个或多个模板参数定义一系列类。函数模板是基于一个或多个模板参数定义一系列函数的模板。 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>。只有一个名为&#34; im&#34;的变量。您不能使用im<T>来获取变量。

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