2

我试图通过创建重载转换运算符来创建我的数学库和一些 DirectX 内置方法之间的互操作性。基本上,我的结构需要将自己转换为 DirectX 库中与之相关的对象或对象的指针。下面的例子:

//overloaded conversion operators
Vector3D::operator D3DXVECTOR3() const;
Vector3D::operator D3DXVECTOR3*() const;

我的问题在于某些 DirectX 方法具有同时采用引用和指针的重载,因此当我尝试传递我的对象时收到一个模棱两可的调用错误。我想让最终用户尽可能无缝,因此我不想使用显式转换方法(例如 ToD3DXVECTOR3())或显式调用操作员。

所以我希望它表现得像这样:

//signature for DirectX method
//D3DXVec3Add(D3DXVECTOR3* vect1, D3DXVECTOR3* vect2) or
//D3DXVec3Add(D3DXVECTOR& vect1, D3DXVECTOR3& vect2)

Vector3D v1(1,1,1);
Vector3D v2(2,2,2);

D3DXVec3Add(v1, v2);

而不是这样:

D3DXVec3Add(v1.toD3DXVECTOR3(), v2.toD3DXVECTOR3());

我不确定这是否可行,但是对于如何解决歧义有什么建议吗?

编辑:

虽然我不能只依赖于隐式转换,但我将接受 Mr.C64 留下的建议。但是,一个区别是 Vector3D 结构不包含可以转换为成员变量的对象:

struct Vector3D
{
float X;
float Y;
float Z;

...

//Implicit conversion operators
operator D3DXVECTOR3() const;
operator D3DXVECTOR3*() const;
operator DirectX::XMFLOAT3() const;
operator DirectX::XMFLOAT3*() const;
operator DirectX::XMVECTOR() const;
operator DirectX::XMVECTOR*() const;

...

//Explicit conversion methods
D3DXVECTOR3         ToD3DXVECTOR3() const;
static Vector3D     FromD3DXVECTOR3(const D3DXVECTOR3& vector);
DirectX::XMFLOAT3   ToXMFLOAT3() const;
static Vector3D     FromXMFLOAT3(const DirectX::XMFLOAT3& value);
DirectX::XMVECTOR   ToXMVECTOR() const;
static Vector3D     FromXMVECTOR(const DirectX::XMVECTOR& value);

private:

...

};
4

2 回答 2

2

你有可能从中派生出你的Vector3D课程D3DXVECTOR3吗?就像ATL::CRect类派生自 Win32RECT结构一样(添加方便的方法)。

如果这是不可能的,或者只是不适合您的特定设计上下文,请考虑提供显式转换方法,就像std::string提供.c_str()获取const char*指针的方法一样,而不是使用隐式转换。您可能会发现这篇博文也很有趣:

读者问答:为什么现代智能指针不隐式转换为 *?

此外,我注意到D3DXVec3Add()仅使用指向. D3DXVECTOR3因此,如果您无法从中派生自己的类(正如您在评论中所述),提供几个 getter(包括非版本)是D3DXVECTOR3有意义的,如下所示:constconst

class Vector3D
{
public:

  ....

  // Get read-only access to wrapped D3DX vector
  const D3DXVECTOR3* Get() const
  {
      return &m_vec;
  }

  // Get read-write access to wrapped D3DX vector
  D3DXVECTOR3* Get()
  {
      return &m_vec;
  }

private:
  D3DXVECTOR3 m_vec;
};

然后像这样使用它们:

Vector3D v1;
Vector3D v2;
Vector3D vSum;
D3DXVec3Add(vSum.Get(), v1.Get(), v2.Get());
于 2013-01-30T17:14:24.983 回答
1

如果您可以使用 C++11 标准进行编译,则可以进行转换explicit。见https://stackoverflow.com/a/8239402/713961

于 2013-01-30T17:06:43.623 回答