c++ - 从不同的库中隐式转换相似类型以在 C++ 中无缝地协同工作

标签 c++ implicit-conversion glm-math bulletphysics

我正在使用 GLM 和 Bullet Physics,它们都有自己的 vector 类型 - glm::vec3btVector3。它们是完全相同的数据结构,但它们让我很烦,因为它们不能很好地结合在一起。必须进行大量手动转换。

假设我有一个函数 foo(btVector3 f) 并且我想传递一个 glm::vec3 作为参数而不用将它转换为 btVector3 ,类似于将 const char * 传递给需要 std::string 的函数,而不必先将其转换为字符串。

现在我不想进入这些库中的每一个并手动将 operator 放入类中,只是为了在我更新库时破坏它(假设他们甚至允许这样做)执照)。我如何在我自己的项目中使一种类型的 vector 自动转换为另一种类型,反之亦然,而无需进入内部并自行编辑库?

最佳答案

似乎不是一种在不修改至少一个类的情况下使两个类隐式可转换的方法:

来自 C++ 规范

When considering the argument to a constructor or to a user-defined conversion function, only one standard conversion sequence is allowed (otherwise user-defined conversions could be effectively chained).

An expression e is said to be implicitly convertible to T2 if and only if T2 can be copy-initialized from e, that is the declaration T2 t = e; is well-formed (can be compiled), for some invented temporary t.

如果你看看复制初始化意味着什么 http://en.cppreference.com/w/cpp/language/copy_initialization

只能使用转换构造函数,甚至不能使用赋值运算符。由于您无法向类添加构造函数,因此您将无法使用派生类。但是,由于无法链接隐式转换(即编译器在使用中间类型将 A 转换为 C 时不会查找转换),因此在某些情况下您至少需要显式转换。

然而,使用派生类的想法,它可能没有您想象的那么频繁。如果您将任何中间 vector 变量声明为您自己的类,则只需要在将返回值从一个库直接传递到另一个库时显式转换。你可以做到这一点:

MyVec v = GLM::GetVector(a,b,c);   // returns GLM::vec3

Bullet::TransformV(v, matrix);   // accepts btVector3 

你的课应该是这样的:

class MyVec : GLM::vec3
{
public:
      MyVec(GLM::vec3 *vec) {
        ....
      }
      MyVec(btVector3 *vec) {
        ....
      }
      operator btVector3*() const { ... }
}

关于c++ - 从不同的库中隐式转换相似类型以在 C++ 中无缝地协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45251887/

相关文章:

C++从多个具有相同虚函数名的基类继承

c++ - 可移植共享对象?

c++ - 如何调试FindFirstChangeNotification获取的文件变化通知?

c++ - 隐式转换

android - Open GL ES - GLM 库和 Android Studio

c++ - 从 OBB 的模型矩阵中提取 3x3 旋转矩阵

c++ - 继承困惑

null - 正确使用 NotNull

c++ - 从 operator== 隐式调用构造函数

c++ - 旋转对象 OpenGL 时出现严重失真