gpt4 book ai didi

c++ - 按名称或索引引用成员变量

转载 作者:行者123 更新时间:2023-11-27 22:42:14 31 4
gpt4 key购买 nike

我正在编写一个简单的类来处理我正在制作的小型应用程序中的颜色。

此类将有 4 个 double 成员变量,并且希望能够通过名称(即:r、g、b 和 a)或索引(0 代表红色,1 代表绿色和等等)。

此外,如果能够使用大括号括起来的初始化列表进行初始化,那就太好了。

但是,我无法想出一种优雅简洁的方式来对此进行编码。

这是我最好的尝试,它并不漂亮。它也不处理无效索引。

struct Colour{
double r, g, b, a;
double& operator[](int i){
switch(i){
case 0:
return r;
break;
case 1:
return g;
break;
case 2:
return b;
break;
case 3:
return a;
break;
}
}
/* ... */
};
/* ... */
int main(){
Colour c = {1.0, 2.0, 3.0, 4.0};
std::cout << c.g << std::endl;
c[1] = 10.0;
std::cout << c.g << std::endl;
return 0;
}

虽然这确实有效,但我想知道是否还有更多(a) 优雅,并且(b) 执行此操作的高性能(因为此应用程序主要处理像素操作)。

非常感谢。

最佳答案

我觉得你的代码很漂亮。它可以在 switch 语句中使用 default case。我喜欢您专注于为类用户创建灵活的工作流程,但通常在 C++ 中没有免费的午餐。如果你想要更多的选择,你的类(class)会更复杂。

但是,既然你问了。如果对您来说优雅意味着保持您的类定义简洁...

// C++'11
struct Colour
{
double v[4];

double& r = v[0];
double& g = v[1];
double& b = v[2];
double& a = v[3];

double& operator[](int i)
{
assert(i >= 0 && i < 4); // #include <assert.h>
return v[i];
}
};


void test()
{
Colour c{ 1.0, 2.0, 3.0, 4.0 };
std::cout << c.b << std::endl;
}

我遇到的问题:

Colour c{ 1.0, 2.0, 3.0, 4.0, 5.0 };  // does not compile (good!)

double x = 5.0;
Colour c{ 1.0, 2.0, 3.0, 4.0, x }; // compiles (...bad)

顺便说一句,断言在 Debug模式下抛出一个有用的异常,但在 Release模式下编译时检查被删除(通过标志)。

如果是我,我会使用您的代码并添加边界检查。

对于性能,此时您唯一需要关心的就是不要使用低效算法。稍后,如果您完成了性能分析并且该类是瓶颈(大声笑),我们可以尝试对其进行优化。顺便说一句,代码简洁和优化不是 friend 。

关于c++ - 按名称或索引引用成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857740/

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