我正在寻找一种在C++ 11中为结构/类的多维数组成员封装重载const_cast
运算符的方法,该多维数组成员定义对该成员的操作。我已经搜索过SO,但是我无法真正找到下文所述问题的答案。
具体来说,我正在处理在第三方C API中定义为typedef
上的double[4][4]
的4x4矩阵。 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
)会遇到麻烦。可能的解决方法是在函数中复制变量或提供对私有(private)数据的访问权,并通过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和non-const引用使用相同的调用。由于评论而添加:
为了更具体地说明我的问题,我想在
const_cast
中添加一种自定义MyMatrix
运算符。如下所示(当然不起作用):operator const ApiMatrix& () const
{
return const_cast<double(*)[4]>(m);
}
最佳答案
选项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));
}