【发布时间】: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<> const Vector2<float> Vector2<float>::ZERO;没有定义变量。为此,您需要一个显式初始化程序(这是 C++03 中的缺点之一,但可以在 C++0x 中解决)。