Не являющиеся членом функции преобразования; Кастинг различных типов, например, вектора DirectX к вектору OpenGL

Я в настоящее время работаю над игрой "механизм", который должен переместить значения между 3D механизмом, механизмом физики и языком сценариев. Так как я должен применить векторы от механизма физики до 3D объектов очень часто и хотеть смочь управлять обоими 3D, а также объекты физики через систему сценариев, мне нужен механизм для преобразования вектора одного типа (например. vector3d<float>) к вектору другого типа (например. btVector3). К сожалению, я не могу сделать предположения о том, как классы/структуры размечаются, таким образом, простое reinterpret_cast вероятно, не сделает.

Таким образом, вопрос: Есть ли своего рода 'помехи '/non-member метод броска для достижения в основном этого:

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)

11
задан sunside 8 June 2010 в 17:05
поделиться

2 ответа

Я бы посоветовал написать их как пару бесплатных функций (т.е. не беспокойтесь о том, чтобы сделать их «операторами»):

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
ответ дан 3 December 2019 в 10:03
поделиться

Ваше утверждение в вопросе верно. Оператор преобразования типа должен быть нестатическим членом. Если вам действительно нужна семантика преобразования типа, вы можете расширить каждый из этих классов для использования в коде приложения:

// 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
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: