我有一个template class
有很多功能,只想专门研究其中的一些,同时还要添加一个成员变量。
这是否可能无需重新实现专业类的所有功能?
我有什么:
template<class T> class Vector3
{
union {
T data[3];
struct { T x, y, z; };
};
//a lot of functions
T Length() { ... };
};
我想做什么:
template<> class Vector3<float>
{
union {
float data[3];
struct { float x, y, z; };
//new union member only for <float>!
__m128 xmm;
};
float Length() {
//special instructions for special case <float>
};
};
由于95%的所有功能都完全相同,我绝对不希望为每一个专业化重新实现它们。我怎样才能做到这一点?
答案 0 :(得分:3)
你可以做的一件事就是制作一个帮助模板,生成一个结构与联合类型,即&#34;核心&#34;您的类型:
template <typename T>
struct Vector3_core {
union {
T data[3];
struct { T x, y, z; };
};
T length() { ... }
};
根据需要将其专门用于float
:
template <>
struct Vector3_core<float> {
union {
float data[3];
struct { float x, y, z; };
__m128 xmm;
};
float Length() { ... }
};
然后你可以使用简单的继承来编写主类,如:
template<class T> class Vector3 : public Vector3_core<T>
{
// Need to pull anonymous-struct members into this class' scope
using Vector3_core<T>::x;
using Vector3_core<T>::y;
using Vector3_core<T>::z;
// All your functions...
};
请注意,这里没有虚拟调度。此外,您不需要公开继承公开,您可以将其设为私有并公开转发Length
功能。
如果有用的话,您还可以进一步使用完整的CRTP。
这是Coliru的代码示例,显示该想法至少适用于C ++ 11标准。