用于多维数组的C ++ const_cast运算符

时间:2017-07-14 08:42:54

标签: c++ arrays c++11 const-cast

我正在C ++ 11中寻找一种方法来封装一个重载的const_cast运算符,用于定义成员操作的结构/类的多维数组成员。我已经搜索了SO,但我无法找到下面描述的问题的答案。

具体来说,我在typedef处理第三方C API中定义的4x4矩阵为double[4][4]。 API还使用此矩阵提供函数。

API如下所示:

typedef double ApiMatrix[4][4];

bool ApiMatrixFunction(ApiMatrix matrix)
{
    // .. some code
    return true;
}

我已经实现了结构MyMatrix来封装对这种数据类型的操作:

struct MyMatrix
{
private:
//public:
    double m[4][4];

public:

    MyMatrix() { ... }

    // lots of operations and initialization members
    ....

    // overloading typical calculation operators +,-,*, ....
    ....

    // cast operator to the API data type
    operator ApiMatrix& ()
    {
        return m;
    }
};

使用MyMatrix作为参考(MyCodeWithRef)时效果很好,但将其用作常量引用(MyCodeWithConstRef)会很麻烦。可能的解决方法是复制函数中的变量或授予对私有数据的访问权限,并通过const_cast<double(*)[4]>(matrix.m)将其强制转换。

// Using MyMatrix reference
void MyCodeWithRef(MyMatrix& matrix)
{
    ApiMatrixFunction(matrix);
}

// Using MyMatrix constant reference
void MyCodeWithConstRef(const MyMatrix& matrix)
{

    // Unfortunately, this fails
    ApiMatrixFunction(matrix);

    // workaround 1: copy the matrix
    MyMatrix m = matrix;

    // workaround 2: use a cast operator in this function
    // requires access to the private m.
    ApiMatrixFunction(const_cast<double(*)[4]>(matrix.m));
}

这两种解决方法都有明显的缺点,我正在寻找一种在const_cast结构中定义MyMatrix运算符的方法,因此我可以对const和非const使用相同的调用引用。

由于评论而添加:

为了更具体地说明我的问题,我想向const_cast添加一种自定义MyMatrix运算符。像下面这样的东西(当然不起作用):

operator const ApiMatrix& () const
{
   return const_cast<double(*)[4]>(m);
}

1 个答案:

答案 0 :(得分:0)

选项A:

typedef double ApiMatrix[4][4];

class Matrix {
    ApiMatrix a;
public:
    operator ApiMatrix&() const {
        return const_cast<ApiMatrix&>(a);
    }
};

bool ApiMatrixFunction(ApiMatrix matrix)
{
    // .. some code
    return true;
}

// Using MyMatrix reference
void MyCodeWithRef(Matrix& matrix)
{
    ApiMatrixFunction(matrix);
}

// Using MyMatrix constant reference
void MyCodeWithConstRef(const Matrix& matrix)
{
    ApiMatrixFunction(matrix);
}

选项B:

typedef double ApiMatrix[4][4];

class Matrix {
    ApiMatrix a;
public:
    operator const ApiMatrix&() const {
        return a;
    }
};

bool ApiMatrixFunction(ApiMatrix matrix)
{
    // .. some code
    return true;
}

// Using MyMatrix reference
void MyCodeWithRef(Matrix& matrix)
{
    const ApiMatrix& a = matrix;
    ApiMatrixFunction(const_cast<ApiMatrix&>(a));
}

// Using MyMatrix constant reference
void MyCodeWithConstRef(const Matrix& matrix)
{
    const ApiMatrix& a = matrix;
    ApiMatrixFunction(const_cast<ApiMatrix&>(a));
}