C++ 创建样例库

C++ 创建样例库,c++,windows,visual-studio-2008,optimization,colors,C++,Windows,Visual Studio 2008,Optimization,Colors,嘿,大家好,我正在清理上学期的代码 以前我在C++中创建了一个151色的SabVIEW库。然而,由于时间紧迫和缺乏经验,我将其完全创建为一个define语句块。这对于将值硬编码到点很有效。然而,这种方法有一些明显的弱点 到目前为止,我所做的是创建一个名称空间“样例”,在名称空间内,我将有一个有效颜色的枚举。我还有一个“getSwatch”函数,或者类似的函数,它将返回一个vec3,一个我的类,表示一个由3个元素组成的向量,具有一些很好的功能,并且该函数将使用switch语句遍历有效的样例 它看起

嘿,大家好,我正在清理上学期的代码

以前我在C++中创建了一个151色的SabVIEW库。然而,由于时间紧迫和缺乏经验,我将其完全创建为一个define语句块。这对于将值硬编码到点很有效。然而,这种方法有一些明显的弱点

到目前为止,我所做的是创建一个名称空间“样例”,在名称空间内,我将有一个有效颜色的枚举。我还有一个“getSwatch”函数,或者类似的函数,它将返回一个vec3,一个我的类,表示一个由3个元素组成的向量,具有一些很好的功能,并且该函数将使用switch语句遍历有效的样例

它看起来像这样:

namespace swatch{

    enum color{
        red,
        blue,
        green
    }

    inline
    const vec3 getColor(const color& c){
        // Switch and return red blue or green.
    }
}
我的问题:我想知道你建议怎么做?性能和可用性的好处是我最感兴趣的

提前感谢各位朋友

快乐编码

编辑:我刚刚更改了示例,以便对不知道如何使用我的vec类的人更有意义。i、 e:除了我,所有人都喜欢。此外,您还可以查看其他Anwser的使用情况。他们对将rgb值传递给构造函数做了一个很好的猜测,我不是这样做的,但我仍然可以很好地理解您的意思。

您可以使用:

然后你的getColor函数就是:

  return colors[color];
完成了

使用查找表:

/************* .h *************/

enum color{
    red,
    blue,
    green,

    colors_count
}

const vec3 &getColor(color c)
{
    extern const vec3 colors_table[colors_count];
    return colors_table[c];
}

/************* .cpp *************/

extern const vec3 colors_table[colors_count] = {
    vec3(255, 0, 0), // red
    vec3(0, 0, 255), // blue
    vec3(0, 255, 0), // green
};
你们并没有写任何关于使用模板的目的的东西,所以我只是删除了它们。如果你再多解释,也许我会帮你

//编辑 它非常简单,速度也非常快。 在C++中,枚举值不仅仅是一些标识符,它们是数字。如果不指定其他,它们将从0开始衰减数字:“红色”为0,“蓝色”为1,“绿色”为2,“颜色计数”为3请参见。
可以使用这些数字为数组编制索引。然后,您只需从给定索引的数组中选择一项。

我不明白您想做什么。为什么getColor接受一种颜色,为什么它是一个模板?对不起,我会解释的。这与vec类有关。vec类接受一个模板。get color接受一种颜色,因此它可以返回表示为vec的颜色。例如:vec背景3;backgroundCol=swatch::getColorred;所以backgroundCol[0]等于1,那么backgroundCol[1]和backgroundCol[2]都等于零。假设一个RGB比例,其中每个值是0到1。好吧,先生,我喜欢这样。向颜色添加更多的关联,然后使用switch语句。然而,使用这种颜色排序的方法,我不需要一直在内存中保存每种颜色的副本吗?@Xoorath:那么你有多少种颜色?如果小于10^6,有什么问题吗?@迈克:我有151个。不一定有“问题”。然而,我将在制作视频游戏时使用它,在内存可能有限的平台上;假设每个vec有4个元素RGBA,那么我在内存中有604个浮点或双精度浮点,这时我可以使用处理能力在颜色之间切换,而不是存储数据。我只是想知道我是否能在消耗CPU功率和内存之间找到一个很好的平衡点。不过,这仍然是一个可行的选择。好吧,您无法初始化贴图,那么如果map::find没有找到颜色,您可以添加它。。。或者,您可以只给与十六进制值匹配的枚举值。@Xoorath:听起来您需要的只是一个RGBA值数组。在编译器中初始化它,因此初始化它不消耗任何代码。通过整数枚举对其进行索引。无论是在时间上还是在内存上,你都无法获得比这更高的效率。我真想知道为什么要用浮点存储每个R/G/B/A值。在没有浮点转换开销的情况下,8位或16位的定点分数不是也可以吗?基本上是@adf88的解决方案。是的,很抱歉,我将很快取消上面示例中的模板。不过这很有趣。我得读点书,试试这个。实际上我不确定这到底是怎么回事。
  return colors[color];
/************* .h *************/

enum color{
    red,
    blue,
    green,

    colors_count
}

const vec3 &getColor(color c)
{
    extern const vec3 colors_table[colors_count];
    return colors_table[c];
}

/************* .cpp *************/

extern const vec3 colors_table[colors_count] = {
    vec3(255, 0, 0), // red
    vec3(0, 0, 255), // blue
    vec3(0, 255, 0), // green
};