Я пытаюсь создать взаимодействие между моей библиотекой Math и некоторыми встроенными методами 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. Одно отличие состоит в том, что структура 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:
...
};