Используйте класс как плавающий указатель взаимозаменяемо

0

Интересно, существует ли способ использования класса и указателя с плавающей точкой взаимозаменяемо. Допустим, класс - это в основном массив удвоений (фиксированный размер). Если у меня есть указатель на класс, я могу использовать его как указатель 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?

большое спасибо

Теги:
class
arrays
pointers

1 ответ

1
Лучший ответ

Нет способа сделать то, что вы хотите, но вы можете сделать что-то очень похожее.

Сначала создайте новый конструктор для 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 будут потеряны.

  • 0
    Большое спасибо за это решение. Это очень полезно. Тем не менее, меня очень беспокоит скорость, так как я часто использую матрицы, поэтому я мог бы остаться со старым способом, использующим typeded float Matrix4x4[16] Я также хотел бы внести изменения, передав указатель. Я уверен, что возможно изменить конструктор класса Matrix4x4, в котором хранится только указатель, но это будет слишком сложно, если я захочу, чтобы он сохранял данные ... В любом случае, большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню