gpt4 book ai didi

c++ - 具有不同顺序或变量的模板类(颜色/像素类)

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

我有两个类模板 Color3_t 和 Color4_t,它们存储 3 个和 4 个颜色 channel ,如下所示:

template <typename TYPE>
struct Color3_t
{
TYPE Red;
TYPE Green;
TYPE Blue;

void Zero()
{
Red = Green = Blue = 0;
}
(...)
}

这两个模板都有几个用于反转、交换等颜色 channel 的函数,我得到了另一个继承这些类的专用模板——以防 TYPE 是半 float 或 float 而不是整数。

问题是颜色 channel 的顺序:红色、绿色和蓝色目前是固定的——这意味着我必须为每个其他颜色 channel 顺序(如 BGR、GRB 等)创建一个 Color3_t 类模板版本。 ).如何提供和论证不同的颜色顺序 - 最有可能指向如下所示的颜色结构。

RGB 和 BGR 颜色顺序的颜色数据结构:

template <typename TYPE>
struct ColorRGB_t
{
TYPE Red;
TYPE Green;
TYPE Blue;
};

template <typename TYPE>
struct ColorBGR_t
{
TYPE Blue;
TYPE Green;
TYPE Red;
};

还有我想要的东西 - 这显然是错误和不正确的,但应该让我知道我想要实现什么。

template <typename TYPE, class COLORORDER<TYPE>>
struct Color3_t : public COLORORDER<TYPE>
{
void Zero()
{
Red = Green = Blue = 0;
}
(...)
};

我还想直接访问每个颜色 channel :

typedef Color3_t<BYTE,ColorBGR_t<BYTE>> ColorRGB8bpc;
ColorRGB8bpc oColor;
oColor.Red = 0;

代替:

oColor.SomoObject.Red = 0;

最佳答案

您需要将存储的红色/绿色/蓝色类型向下推送到 Color***_t 类中,如下所示:

template <typename TYPE>
struct ColorRGB_t
{
typedef TYPE value_type;

value_type Red;
value_type Green;
value_type Blue;
};

template <typename TYPE>
struct ColorBGR_t
{
typedef TYPE value_type;

value_type Blue;
value_type Green;
value_type Red;
};

然后 Color3 只采用一个模板参数,它是您的 Color***_t 类型之一:

template <typename Order_t>
struct Color3 : public Order_t
{
typedef typename Order_t::value_type value_type;

void Zero()
{
//static cast zero here to avoid compiler warnings when value_type is a float or double
Order_t::Red = Order_t::Green = Order_t::Blue = static_cast<value_type>(0);
}
};

然后您将对象声明为:

Color3<ColorBGR_t<float> > c1;
Color3<ColorRGB_t<float> > c2;

这对你有用吗?它避免了在运行时对数组进行索引的开销,并且可以像 c1.Red = 0.0 一样直接使用 Red/Green/Blue 成员。

关于c++ - 具有不同顺序或变量的模板类(颜色/像素类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1717475/

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