非会员转换功能; 转换不同的类型,例如DirectX向量到OpenGL向量

sun*_*ide 11 c++ casting

我目前正在研究一种游戏"引擎",它需要在3D引擎,物理引擎和脚本语言之间移动值.由于我需要经常将物理引擎中的矢量应用到3D对象,并且希望能够通过脚本系统控制3D以及物理对象,我需要一种机制来转换一种类型的矢量(例如vector3d<float>)到另一种类型的向量(例如btVector3).不幸的是,我不能对类/结构的布局做出任何假设,所以一个简单的reinterpret_cast可能不会做.

所以问题是:是否有某种"静态"/非成员投射方法基本上实现:

vector3d<float> operator vector3d<float>(btVector3 vector) {
    // convert and return
}

btVector3 operator btVector3(vector3d<float> vector) {
    // convert and return
}
Run Code Online (Sandbox Code Playgroud)

现在这不会编译,因为转换操作符需要是成员方法.(error C2801: 'operator foo' must be a non-static member)

Ada*_*erg 5

我建议将它们编写为一对自由函数(即,不必担心将它们变成“运算符”):

vector3d<float> vector3dFromBt(const btVector3& src) {
    // convert and return
}

btVector3 btVectorFrom3d(const vector3d<float>& src) {
    // convert and return
}

void f(void)
{
  vector3d<float> one;   
// ...populate...   
  btVector3 two(btVectorFrom3d(one));    
// ...
  vector3d<float> three(vector3dFromBt(two));
}
Run Code Online (Sandbox Code Playgroud)


Arn*_* L. 5

您还可以使用模板化包装类,例如:

template<class V>
class vector_cast {};

template<>
class vector_cast<vector3d> {
  const vector3d& v;

public:

  vector_cast(const vector3d& v) : v(v) {};

  operator vector3d () const {
    return vector3d(v);
  }

  operator btVector3 () const {
    // convert and return
  }
};

template<>
class vector_cast<btVector3> {
  const btVector3& v;

public:

  vector_cast(const btVector3& v) : v(v) {};

  operator btVector3 () const {
    return btVector3(v);
  }

  operator vector3d () const {
    // convert and return
  }
};
Run Code Online (Sandbox Code Playgroud)

用法:

void set_origin(btVector3 v);

// in your code:

vector3d v;
// do some fancy computations
set_origin(vector_cast(v));

// --- OR the other way round --- //

void set_velocity(vector3d v);

// in your code:

btVector3 v;
// do some other computations
set_velocity(vector_cast(v));
Run Code Online (Sandbox Code Playgroud)