我收到有关变量模板的 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;
}
什么是变量模板的完整定义,为什么这个没有变量模板问题
最佳答案
类模板是基于一个或多个模板参数定义一系列类的模板。函数模板是基于一个或多个模板参数定义一系列函数的模板。 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
的变量。 .函数在这里是模板,不是变量。
关于c++ - 什么是变量模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040985/