定义模板类的静态常量变量

Defining static const variables of a template class

本文关键字:静态 常量 变量 定义      更新时间:2023-10-16

我有一个向量类,它有一些静态常量变量,比如ZERO。现在,由于vector通常被实现为模板类(我的也不例外),我看到了很多这样的代码:

template<> const Vector2<float> Vector2<float>::ZERO;
template<> const Vector2<float> Vector2<float>::UNIT_X(1, 0);
//... and so on, and then all code duplicated for other types (int, double, long double)
// including different sizes of the Vector (Vector2, Vector3, Vector4)

我的问题是,我能做这样的事情来避免重复不同类型的代码吗:

template <typename T, unsigned int SIZE>
const Vector<T, SIZE> Vector<T, SIZE>::ZERO;

这能满足未来所有类型的需求吗?如果不是,如果我用以下内容明确定义各种类型的类,会有什么不同吗:

template Vector<float, 2>;
template Vector<float, 3>;

到目前为止,我已经在Visual C++(2008)上对它进行了测试,它编译得很好,测试也通过了,但我想知道这是否是非标准代码。

不,这是完全合法且完全标准的。如果你想在模板类中使用静态变量,你不可能定义它的所有可能的实例化——这些类型甚至可能是不可命名的,因此是可特殊化的。因此,模板类可以为所有可能的用途定义静态变量是非常必要的。

没关系。

模板是告诉编译器为不同类型生成类似代码的一种方式
这正是它的用途。