首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非成员转换函数;转换不同的类型,例如从DirectX向量到OpenGL向量

非成员转换函数;转换不同的类型,例如从DirectX向量到OpenGL向量
EN

Stack Overflow用户
提问于 2010-06-09 00:57:29
回答 3查看 9K关注 0票数 14

我目前正在开发一个游戏“引擎”,它需要在3D引擎、物理引擎和脚本语言之间移动数值。由于我需要经常将来自物理引擎的向量应用于3D对象,并且希望能够通过脚本系统控制3D以及物理对象,因此我需要一种机制来将一种类型的向量(例如vector3d<float>)转换为另一种类型的向量(例如btVector3)。不幸的是,我不能假设类/结构是如何布局的,所以一个简单的reinterpret_cast可能无法做到这一点。

所以问题是:有没有某种“静态”/非成员类型的方法来基本实现这一点:

代码语言:javascript
复制
vector3d<float> operator vector3d<float>(btVector3 vector) {
    // convert and return
}

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-09 01:23:14

我建议把它们写成一对自由函数(也就是说,不用担心把它们变成“运算符”):

代码语言:javascript
复制
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));
}
票数 5
EN

Stack Overflow用户

发布于 2013-05-21 01:05:25

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

代码语言:javascript
复制
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
  }
};

用法:

代码语言:javascript
复制
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));
票数 5
EN

Stack Overflow用户

发布于 2010-06-09 05:33:49

你在问题中的陈述是正确的。类型转换运算符需要是非静态成员。如果您确实需要转换类型语义,则可以扩展这些类中的每个类,以便在应用程序代码中使用:

代码语言:javascript
复制
// header:
class ConvertibleVector3d;

ConvertibleBtVector : public btVector3
{
  operator ConvertibleVector3d() const;
}

ConvertibleVector3d : public vector3d<float>
{
  operator ConvertibleBtVector() const;
}

//impl:
ConvertibleBtVector::operator ConvertibleVector3d() const
  {
    ConvertibleVector3d retVal;
// convert this into retVal...
    return retVal;
  }

ConvertibleVector3d::operator ConvertibleBtVector() const;
  {
    ConvertibleBtVector retVal;
// convert this into retVal...
    return retVal;
  }

void f(void)
{
  ConvertibleVector3d one;   
// ...populate...   
  ConvertibleBtVector two(one);    
// ...
  ConvertibleVector3d three;
  three = two;
}

名称有点冗长,但希望其意图是明确的。

公共继承意味着您应该能够以与基类相同的方式使用这些类的实例,除非它们彼此之间是可分配和可构造的。当然,这将两个类结合在一起,但这可能是可以接受的,因为这听起来像是您的应用程序想要做的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2999506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档