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());

これが可能かどうかはわかりませんが、あいまいさを修正する方法について何か提案はありますか?

編集:

暗黙の変換だけに頼ることはできませんが、C64氏が残した提案を使用します。ただし、1つの違いは、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

からクラスを派生させることは可能でしょうか? クラスが Win32 構造から派生するのと同じように(便利なメソッドを追加します)。Vector3DD3DXVECTOR3ATL::CRectRECT

これが不可能な場合、または特定の設計コンテキストにうまく適合しない場合は、暗黙的な変換を使用する代わりに、ポインターを取得するメソッドをstd::string提供するのと同じように、変換に明示的なメソッドを提供することを検討してください。このブログ投稿も興味深いかもしれません。.c_str()const char*

読者 Q&A: 最新のスマート ポインターが暗黙的に * に変換しないのはなぜですか?

さらに、のインスタンスへのポインターD3DXVec3Add()を使用するだけであることに注意しました。したがって、 (コメントで述べたように)独自のクラスを派生できない場合は、次のようにいくつかのゲッター(バージョンと非バージョンの両方)を提供するのが理にかなっています。D3DXVECTOR3D3DXVECTOR3constconst

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 標準を使用してコンパイルできる場合は、変換を行うことができますexplicithttps://stackoverflow.com/a/8239402/713961を参照してください

于 2013-01-30T17:06:43.623 に答える