gpt4 book ai didi

C++(以某种方式)将结构限制为父 union 大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:51 25 4
gpt4 key购买 nike

我正在尝试创建一个可变大小的颜色类 - 给定一个模板确定的值数组,我想为数组中的每个值创建命名别名,即:

template<int C = 3, typename T = unsigned char>
class Color {
public:
union {
T v[C];
struct {
T r, g, b, a;
};
};
};

但是,如果我尝试对 C=3 使用相同的类, union 要求大小为 4 个字节(“a”成员)。或者,使用 a 的数学表达的位域大小(名为 a 的结构,匿名 T 成员,大小在 C>3 时计算为 1),编译器发出一个许可警告(不可抑制,根据 In gcc, how to mute the -fpermissive warning? ),这是不适合的更大规模的 API。

我将如何允许单个类处理不同数量的变量,同时保留每个变量的名称并且不实现递归包含宏魔术(尝试过,不应该)。提前致谢!

编辑:为了澄清问题,以下任何一个的答案都将解决这个问题:

  • 抑制 GCC 的 -fpermissive 错误(#pragma diagnostic ignored 不适用于 permissive)
  • 设置 union 或子结构的最大大小不超过 C 字节
  • 对于未被 C 字节覆盖的成员,允许位域长度为 0(GCC 允许位域长度的数学表达式,例如 (C-3 > 0)?8:0; )
  • 通过其他方式(即虚构的 static_if() )禁用未被 C 字节覆盖的成员

最佳答案

您可以针对 C 的不同情况对结构进行专门化:

template <int C = 3, typename T = unsigned char> union Color;

template <typename T>
union Color<3,T> {
T v[3];
struct {
T r,g,b;
};
};

template <typename T>
union Color<4,T> {
T v[4];
struct {
T r,g,b,a;
};
};

请注意,匿名结构是非标准的。

如果可以使用成员函数,我认为那将是一个更好的方法:

template <int C,typename T>
class Color {
public:
using Values = T[C];

Values &v() { return v_; }

const Values &v() const { return v_; }

T& r() { return v_[0]; }
T& g() { return v_[1]; }
T& b() { return v_[2]; }

template <int C2 = C,
typename = typename std::enable_if<(C2>3)>::type>
T& a()
{
return v_[3];
}

const T& r() const { return v_[0]; }
const T& g() const { return v_[1]; }
const T& b() const { return v_[2]; }

template <int C2 = C,
typename = typename std::enable_if<(C2>3)>::type>
const T& a() const
{
return v_[3];
}

private:
Values v_;
};

然后你可以像这样使用它:

int main()
{
Color<3,int> c3;
Color<4,int> c4;

c3.v()[0] = 1;
c3.v()[1] = 2;
c3.v()[2] = 3;

std::cout <<
c3.r() << "," <<
c3.g() <<"," <<
c3.b() << "\n";

c4.v()[0] = 1;
c4.v()[1] = 2;
c4.v()[2] = 3;
c4.v()[3] = 4;

std::cout <<
c4.r() << "," <<
c4.g() << "," <<
c4.b() << "," <<
c4.a() << "\n";
}

关于C++(以某种方式)将结构限制为父 union 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28950368/

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