空间矢量,颜色矢量

时间:2010-07-22 19:45:29

标签: c++

假设你有两个概念上不同的东西(空间矢量,颜色矢量)(空间与颜色的位置)但它们实际上最终需要相同类型的操作 - 重载加号,减号,标量乘法。

Cg编程语言的一个很好的解决方案是他们实际上将成员名称.xyzw和.rgba别名。所以在Cg你可以做到

float4 vector = float4( 4, 3, 2, 1 );

float red = vector.r ;
float x = vector.x ;
// both red and x will have the value 4.0.

所以问题是:你如何处理概念上不同但程序上相同的事情?我可以简单地使用一个Vector类并“记住”.x = .r,.y = .g等等,这不是那么难,但似乎有点误导。

另一种选择是完全重复Vector和Color中的代码。

哪个更好? 重复代码是为了便于阅读,还是只是生活在错误的命名中?

4 个答案:

答案 0 :(得分:2)

如果您真的想要这种别名,可以使用联合,例如

struct Vec {
  union {
    float r;
    float x;
  };
  ...
};

就个人而言,我可能已经定义了一个使用()[]运算符进行访问的向量类型,并生成SpatialVectorColorVector typedef。通过索引访问,您可以轻松地迭代元素。

答案 1 :(得分:1)

(警告:以下建议来自Java程序员。)

似乎是私人继承或组合的好例子。 Color可以使用r()g()b()等公开一个公共界面,它可以简单地委托给Vector进行实际实施。您可能不希望使用公共继承,因为在大多数情况下Color并不是Vector的替代品。

如果实际上Vector上的大多数操作对Color都没有用(反之亦然),而您感兴趣的是拥有四个属性的对象,那么也许一个不应该是完全按照另一方的方式实施。

答案 2 :(得分:0)

我重新实现操作而不是共享。但是,......

你可以使用 x r 共享一个值, y g 共享一个值,等

或者,实现float4并制作Color / Vector派生类。

答案 3 :(得分:0)

由于你代表了不同的概念,我个人会创造不同的类型。更清晰的意图胜过我书中避免重复的代码。

或者如果你想把问题彻底解决,你可能会更加普遍。只需使用普通的旧std :: vector并通过索引访问不同的元素。在这种情况下,您将丢失一些特定于域的上下文,以换取更容易推广的算法。然后你可以在它周围创建简单的包装器,提供更多概念上正确的成员。