【问题标题】:Defining static const variables of a template class定义模板类的静态常量变量
【发布时间】:2011-06-18 16:26:03
【问题描述】:

我有一个向量类,它有一些静态常量变量,比如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) 上对其进行了测试,它编译良好并且测试通过了,但我想知道这是否是非标准代码。

【问题讨论】:

  • 为宏保留所有大写名称是个好主意。请参阅任何 C++ 常见问题解答。将它们用于常量是一种 Java 主义,您可能会无意中替换文本。 Java 约定来自原始 C,其中常量“必须”表示为宏符号。将其重新插入 C++ 非常愚蠢。
  • @Alf P. Steinbach:"Using them for constants is a Java'ism, where you risk inadvertent text replacement" 不确定我是否完全理解。我如何冒文本替换的风险?
  • 其他人可能已经定义了一个名为 ZERO 的宏。此外,它是一个眼睛。使用全部大写就像大喊一样,不要这样做。
  • @Alf:虽然零对于宏来说是一个非常糟糕的选择(ATOM 也是如此!)但我明白你的意思。我将重命名代码中的所有宏参数。希望我们的编码手册中对此没有具体的指导方针/规则。
  • 没关系。此外,template&lt;&gt; const Vector2&lt;float&gt; Vector2&lt;float&gt;::ZERO; 没有定义变量。为此,您需要一个显式初始化程序(这是 C++03 中的缺点之一,但可以在 C++0x 中解决)。

标签: c++ templates


【解决方案1】:

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

【讨论】:

  • 好的,我刚刚发现如果我在源文件中定义静态变量(即 Vector.cpp)会出现链接错误,除非我使用使用静态变量的类型实例化类首先。只是想我会为未来的 SO'er 澄清这一点。
【解决方案2】:

没关系。

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

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2019-05-10
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多