基本上,我想做的是构建一个 Vector 模板,它有两个参数:维度和变量类型。
template <typename Type, unsigned ElementCount>
class TVector
{
private:
public:
union
{
struct
{
Type X, Y, Z, W;
};
struct
{
Type Red, Green, Blue, Alpha;
};
Type Values[ElementCount];
};
}
一切正常,但您可能已经注意到,这仅适用于 4 元素 vector ,因为只有 Values 变量依赖于 ElementCount。 ElementCount=1 仅声明 X 和 Red,2 声明 Y 和 Green,依此类推... 所以,我想要的是根据 ElementCount 值声明其他变量。
有可能吗?我不这么认为,但无论如何都想确定一下。
我正在考虑单独声明整个 union 并将其作为模板参数传递,但这太丑陋了......
编辑: 该死的。现在我想起来了……关于按值构造函数呢?
参数计数依赖于模板参数 ElementCount...如何做到这一点?
最佳答案
您可以通过部分特化来做到这一点。有点像
template<typename T, unsigned N>
struct S
{
union
{
struct
{
T X, Y, Z, W;
};
struct
{
T Red, Green, Blue, Alpha;
};
T Values[N];
};
};
template<typename T>
struct S<T, 1>
{
union
{
struct
{
T X;
};
struct
{
T Red;
};
T Values[1];
};
};
int main()
{
using S1 = S<char, 1>;
using S5 = S<char, 5>;
std::cout << "sizeof(S1) = " << sizeof(S1) << '\n';
std::cout << "sizeof(S5) = " << sizeof(S5) << '\n';
}
它应该打印
sizeof(S1) = 1 sizeof(S5) = 5
Also, doing e.g.
S1 s1;
s1.Y = 0;
应该给你一个结构没有成员 Y
的错误。
是的,要编写(或复制粘贴)的内容要多得多,但它应该可以解决您的问题。
关于c++ template specialization-specific 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27803186/