Я в настоящее время работаю над игрой "механизм", который должен переместить значения между 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
)
Я бы посоветовал написать их как пару бесплатных функций (т.е. не беспокойтесь о том, чтобы сделать их «операторами»):
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));
}
Ваше утверждение в вопросе верно. Оператор преобразования типа должен быть нестатическим членом. Если вам действительно нужна семантика преобразования типа, вы можете расширить каждый из этих классов для использования в коде приложения:
// 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;
}
Названия немного многословны, но, надеюсь, смысл понятен.
Открытое наследование означает, что вы сможете использовать экземпляры этих классов так же, как и базовый класс, за исключением того, что они будут присваиваемыми и конструируемыми друг из друга. Конечно, это объединяет два класса, но это может быть приемлемо, поскольку похоже, что именно это ваше приложение собирается делать в любом случае.