Интересно, существует ли способ использования класса и указателя с плавающей точкой взаимозаменяемо. Допустим, класс - это в основном массив удвоений (фиксированный размер). Если у меня есть указатель на класс, я могу использовать его как указатель float (просто с соответствующим оператором), однако, если у меня есть указатель, я не знаю, как его автоматически использовать в качестве класса.
Позвольте мне объяснить немного больше моей проблемы. Я использую Matrix4x4 typedef для хранения матрицы 4x4:
typedef float Matrix4x4[16];
У меня есть много функций, которые принимают Matrix4x4
как float*
Теперь я пытаюсь использовать базовый класс так же, как использовал Matrix4x4:
class Matrix4x4 {
float matrix[16];
public:
Matrix4x4();
float operator[](int i){
return matrix[i];
}
operator float*() const{ // I can pass to functions that take a float*
return (float*) matrix;
}
};
Проблема остается, когда мне нужно вызвать такую функцию:
bool test(void){
float H[16];
// ... process H
return isIdentidy( H); // I want the compiler to accept it this way
return isIdentidy((float*) H); // or this way
}
bool isIdentity(const Matrix4x4 matrix){
... (process)
return ...;
}
В самом конце указатель должен быть тем же самым правом?
(если я объявил H как Matrix4x4 H
вместо float H[16]
Есть ли способ сделать это без использования static_cast или dynamic_cast?
большое спасибо
Нет способа сделать то, что вы хотите, но вы можете сделать что-то очень похожее.
Сначала создайте новый конструктор для Matrix4x4, который принимает аргумент float [16]
class Matrix4x4 {
float matrix[16];
public:
Matrix4x4();
Matrix4x4(float values[16])
{
memcpy(matrix, values, sizeof(float)*16);
}
float operator[](int i){
return matrix[i];
}
operator float*() const{
return (float*) matrix;
}
};
Тогда вы можете сделать
bool test(void){
float H[16];
// ... process H
return isIdentidy(Matrix4x4(H));
}
bool isIdentity(const Matrix4x4 matrix){
... (process)
return ...;
}
Однако любые изменения в новом Matrix4x4 будут потеряны.
typeded float Matrix4x4[16]
Я также хотел бы внести изменения, передав указатель. Я уверен, что возможно изменить конструктор класса Matrix4x4, в котором хранится только указатель, но это будет слишком сложно, если я захочу, чтобы он сохранял данные ... В любом случае, большое спасибо!