你可以做的一件事是创建一个帮助器模板,生成一个结构与联合类型,它是你的类型的“核心”:
template
struct Vector3_core {
union {
T data[3];
struct { T x, y, z; };
};
T length() { ... }
};
并根据需要将其专门用于浮动:
template <>
struct Vector3_core {
union {
float data[3];
struct { float x, y, z; };
__m128 xmm;
};
float Length() { ... }
};
然后你可以使用简单的继承来编写主类,如:
template class Vector3 : public Vector3_core
{
// Need to pull anonymous-struct members into this class' scope
using Vector3_core::x;
using Vector3_core::y;
using Vector3_core::z;
// All your functions...
};
请注意,此处没有虚拟调度.此外,您不需要将继承公开,您可以将其设为私有并公开转发Length函数.
您还可以进一步使用完整的CRTP,如果有用的话.
这是Coliru的代码示例,显示该想法至少符合C 11标准.