gpt4 book ai didi

c++ - 模板成员变量特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:29 24 4
gpt4 key购买 nike

我有一个包含很多函数的模板类,我只想特化其中的几个,同时还添加一个成员变量。

这是否可能不需要重新实现专门类的所有功能?


我有什么:

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% 的功能都完全相同,我绝对不想为每个特化重新实现它们。我怎样才能做到这一点?

最佳答案

您可以做的一件事是制作一个辅助模板,该模板生成一个结构 union 类型,它是您类型的“核心”:

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...
};

请注意,这里没有进行虚拟调度。此外,您不必一定要公开继承,您可以将其设为私有(private)并公开转发 Length 函数。

如果有用的话,您还可以更进一步,使用成熟的 CRTP。

这是 Coliru 上的代码示例,表明该想法至少适用于 C++11 标准。

http://coliru.stacked-crooked.com/a/ef10d0c574a5a040

关于c++ - 模板成员变量特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35106431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com