オーバーロードされた変換演算子を作成することにより、数学ライブラリといくつかの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:
...
};