c++ - 什么是变量模板

标签 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;
}

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

最佳答案

类模板是基于一个或多个模板参数定义一系列类的模板。函数模板是基于一个或多个模板参数定义一系列函数的模板。 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/

相关文章:

c++ - 表达三元条件的结果类型 `?:`

c++ - 如何检查几个小时后连接是否仍然有效?

c++ - 为什么是 "an inherited constructor is not a candidate for initialization from an expression of the same or derived type"?

c++ - 堆数据困惑

c++ - 我可以在 C++ 中强制使用 Escape 键 "press"吗?

c++ - 如何在 includes() 算法中使用 greater_equal 谓词?

c++ - 将 boost::unordered_set 作为结果映射传递给 boost::split

c++ - 为什么模板参数替换的顺序很重要?

c++ - "Builder"函数模板

c++ - 许多功能的相同模板