在 C++ 中,在库之间进行类似 类 转换的最佳方法是什么?
In C++, what is the best way to do conversions of similar classes between libraries?
我碰巧正在从事一个使用 glm
和 Box2D
库的项目。这两者都包括例如 2D 矢量的实现。有时,我需要将值从一个库的格式转换为另一种格式。我不能只在 类 中编写适当的构造函数,因为这会涉及修改库源代码,出于多种原因,这不是一个好主意。
现在,显而易见的解决方案就是编写一些将一个转换为另一个的实用函数,例如。 convertVec2()
。这行得通。然而,它有点笨拙和冗长,我不禁想知道是否有一些更聪明的方法,可能是使用一些晦涩的语言功能的巧妙使用。
有没有更好的方法解决这个问题?还是干脆干脆干脆?
the obvious solution is just to write some utility functions that convert one to another
should I just do the boring and straightforward thing?
是的,这是一个不错的方法。
请注意,在类型与布局兼容的特殊情况下,您可以简单地将指向一个类型的指针重新解释为指向另一种类型的指针。
简而言之,如果类型是同一类型,或者都是标准布局 class,并且每个 class 的所有成员都与其他 class。例如,以下 classes 是布局兼容的:
struct Vec2D {
float x, y;
};
struct Point {
float X, Y;
};
从 C++20 开始,您可以使用类型特征 std::is_layout_compatible
.
进行测试
没有更好的办法。
而且这不是缺点。这实际上是一个功能。两个库都选择了一个 API 他们认为对你有用但对 他们 也可维护的。封装功能的原因之一是允许开发人员在不破坏您的代码的情况下进行更改。
因此,下周,glm
可能会决定在内部将 3D 向量存储为 std::string
。这将是一个糟糕的决定,但他们可以,只要他们保持 public API。类似地,Box2D
可能决定拥有 copy-on-write 3D 向量的全局存储。这也是一个可疑的想法,但仍然是他们的选择。只要他们维护 API,您就可以让您的代码正常工作。
现在假设您想出了自己的快速转换。一旦两个实现都像上面那样改变,你真的希望它仍然有效吗?没有。
您为拥有稳定的 API 和开发人员能够维护他们的东西所付出的代价是您无法快速 copy/conversion。
我碰巧正在从事一个使用 glm
和 Box2D
库的项目。这两者都包括例如 2D 矢量的实现。有时,我需要将值从一个库的格式转换为另一种格式。我不能只在 类 中编写适当的构造函数,因为这会涉及修改库源代码,出于多种原因,这不是一个好主意。
现在,显而易见的解决方案就是编写一些将一个转换为另一个的实用函数,例如。 convertVec2()
。这行得通。然而,它有点笨拙和冗长,我不禁想知道是否有一些更聪明的方法,可能是使用一些晦涩的语言功能的巧妙使用。
有没有更好的方法解决这个问题?还是干脆干脆干脆?
the obvious solution is just to write some utility functions that convert one to another
should I just do the boring and straightforward thing?
是的,这是一个不错的方法。
请注意,在类型与布局兼容的特殊情况下,您可以简单地将指向一个类型的指针重新解释为指向另一种类型的指针。
简而言之,如果类型是同一类型,或者都是标准布局 class,并且每个 class 的所有成员都与其他 class。例如,以下 classes 是布局兼容的:
struct Vec2D {
float x, y;
};
struct Point {
float X, Y;
};
从 C++20 开始,您可以使用类型特征 std::is_layout_compatible
.
没有更好的办法。
而且这不是缺点。这实际上是一个功能。两个库都选择了一个 API 他们认为对你有用但对 他们 也可维护的。封装功能的原因之一是允许开发人员在不破坏您的代码的情况下进行更改。
因此,下周,glm
可能会决定在内部将 3D 向量存储为 std::string
。这将是一个糟糕的决定,但他们可以,只要他们保持 public API。类似地,Box2D
可能决定拥有 copy-on-write 3D 向量的全局存储。这也是一个可疑的想法,但仍然是他们的选择。只要他们维护 API,您就可以让您的代码正常工作。
现在假设您想出了自己的快速转换。一旦两个实现都像上面那样改变,你真的希望它仍然有效吗?没有。
您为拥有稳定的 API 和开发人员能够维护他们的东西所付出的代价是您无法快速 copy/conversion。