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)
什么是变量模板的完整定义,为什么它没有变量模板问题
类模板是基于一个或多个模板参数定义一系列类的模板.函数模板是基于一个或多个模板参数定义一系列函数的模板.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模式下使用它们的原因.
Run Code Online (Sandbox Code Playgroud)image<T> *im = new image<T>(w, h, false);
这不是变量模板.这是一个常规变量,其类型定义非常明确:image<T>.只有一个名为" im"的变量.您不用im<T>来获取变量.
该陈述没有定义一系列变量.你拥有的是一系列函数,其中每个函数都包含一个名为的变量im.该函数是此处的模板,而不是变量.