在C++中,在库之间转换类似类的最佳方法是什么



我正在处理一个使用glmBox2D库的项目。这两者都包括例如2D矢量的实现。有时,我需要将值从一个库的格式转换为另一个。我不能只在类中编写适当的构造函数,因为这将涉及修改库源代码,这是一个坏主意,原因有很多。

现在,显而易见的解决方案就是编写一些实用函数,将一个函数转换为另一个函数,例如convertVec2()。这是可行的。然而,它有点笨拙和冗长,我不禁想知道是否有更聪明的方法可以做到这一点,可能会巧妙地使用晦涩的语言功能。

有更好的方法来解决这个问题吗?还是我应该只做无聊而直接的事情?

显而易见的解决方案只是编写一些实用程序函数,将一个转换为另一个

我应该只做无聊而直接的事情吗?

是的,这是一个不错的方法。

请注意,在类型与布局兼容的特殊情况下,您可以简单地将指向一个类型的指针重新解释为指向另一种类型的指针。

简言之,如果类型是相同的类型,或者两者都是标准布局类,并且每个类的所有成员都与另一个类的相应成员布局兼容,则类型是布局兼容的。例如,以下类与布局兼容:

struct Vec2D {
float x, y;
};

struct Point {
float X, Y;
};

由于C++20,您可以用类型特征std::is_layout_compatible来测试它。

没有更好的方法了。

这并不是缺点。这实际上是一个功能。这两个库都选择了一个API,它们发现该API对您可用,但也可维护它们。封装特性的一个原因是允许开发人员在不破坏代码的情况下进行更改。

因此,下周,glm可能会决定在内部将3D向量存储为std::string。这将是一个糟糕的决定,但他们可以,只要他们保持公共API。类似地,Box2D可能决定具有写时复制3D矢量的全局存储。这也是一个可疑的想法,但仍然是他们的选择。只要他们维护API,你就可以让你的代码工作。

现在想象一下,你想出了自己的快速转换。一旦两个实现都如上所述发生变化,您真的希望它仍然有效吗?没有。

拥有一个稳定的API和开发人员能够维护他们的东西所要付出的代价是,你无法获得快速的复制/转换。

相关内容

最新更新