可以互换使用class作为浮点指针

时间:2014-01-29 22:04:13

标签: c++ arrays class pointers

我想知道它是否存在一种交替使用类和浮点指针的方法。让我们说一个类基本上是一个双精度数组(固定大小)。如果我有类指针,我可以将它用作浮点指针(使用适当的操作符很容易),但是,如果我有指针,我不知道如何自动将它用作类。

让我解释一下我的问题。 我一直在使用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的情况下完成此任务?

非常感谢

1 个答案:

答案 0 :(得分: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的任何更改都将丢失。