标准化2D/3D矢量/坐标类

Mik*_*eMB 6 c++ standards stl

问题现在
这个问题困扰着我,但我无法找到明确的答案:

  • 是否有人知道有关向STL引入标准2D和/或3D矢量(具有x,y和z成员的结构)的提议?
  • 如果没有,是否有一种现实的方法可以将这样的课程纳入标准的下一版本 - 缺少自己编写一份完整且完美的书面提案?
  • 并且,有什么好的理由(除了没有人有时间)为什么还没有这样做?

我绝对愿意做出贡献,但我相信我缺乏足够高质量的东西才能被接受(我不是专业程序员).

推理/背景
到现在为止,我已经看到了几十个库和框架(无论是图形,物理,数学,导航,传感器融合等......)都基本上都是实现了自己的版本

struct Vector2d {
    double x,y;
    //...
};
/* ...
 * operator overloads
 */
Run Code Online (Sandbox Code Playgroud)

和/或它的3D等价物 - 更不用说在我花时间做一个合适的,可重复使用的版本之前我自己实现的所有场合.
显然,这并不困难,我不担心次优的实现,但每次,我想组合两个库或重用来自不同项目的代码,我必须注意将一个版本转换为另一个版本(通过铸造或 - 如果可能 - 文本替换).

既然委员会正在努力扩展c ++ 17的标准库(特别是使用2D图形框架),我真的希望从一开始就将一个共同的2D向量融入所有接口,所以我可以编写例如:

drawLine(transformCoordinates(trackedObject1.estimatePos(),params), 
         transformCoordinates(trackedObject2.estimatePos(),params));
Run Code Online (Sandbox Code Playgroud)

而不是

MyOwnVec2D t1{trackedObject1.estimatePosX(), trackedObject1.estPosY()};
MyOwnVec2D t2{trackedObject2.estimatePosX(), trackedObject2.estPosY()};

t1 = transformCoordinates(t1,params);
t2 = transformCoordinates(t2,params);

drawLine(t1.x,t1.y,t2.x,t2.y);
Run Code Online (Sandbox Code Playgroud)

这个例子可能有点夸张,但我认为这表明了我的观点.

我知道std::valarray,它已经朝着正确的方向前进,因为它允许标准操作,如加法和乘法,但如果你只需要两个或三个坐标,它就会带来太多的重量.我认为具有固定大小且没有动态内存分配(例如基于std::array)的valarray 将是一个可接受的解决方案,特别是因为它将带有一个简单的迭代器实现,但我个人更喜欢具有x,y(和z)的类成员.

备注:如果这个话题已经讨论过了,我很抱歉(如果没有,我会感到惊讶),但每次我搜索2d向量时,我都会得到结果,std::vector<std::vector<T>>或者如何实现某个转换,但没有关于标准化的主题.

Lig*_*ica 4

有没有什么充分的理由(除了没有人有时间)为什么还没有这样做?

基本上没有理由这样做。

形成包含两个或三个元素的类型是非常简单的,并且所有操作也可以简单地定义。此外,C++ 标准库并不是旨在成为通用数学工具套件:如果您认真对待数学类型和结构,而不仅仅是可以组合在一起的函数和运算符,那么使用专门的第三方库是有意义的。半小时。

我们不会标准化不需要标准化的东西。

如果 C++ 获得某种标准化的 3D 图形 API,那么我可以看到这种情况发生变化,但直到那时。希望 C++ 永远不会获得任何类型的标准化 3D 图形 API,因为这不是它的用途。

但是,如果您对此有强烈的感觉,您可以在标准讨论上开始对话,所有专家(当然还有一些肯定是非专家)都在那里;有时,这样的对话会导致提案的形成,而最终不一定是你来写。