C++ C++;多维数组的const_cast算子
我正在C++11中寻找一种方法,为定义成员操作的结构/类的多维数组成员封装重载的C++ C++;多维数组的const_cast算子,c++,arrays,c++11,const-cast,C++,Arrays,C++11,Const Cast,我正在C++11中寻找一种方法,为定义成员操作的结构/类的多维数组成员封装重载的const\u cast运算符。我已经搜索了这么多,但我真的找不到下面描述的问题的答案 具体来说,我要处理的是第三方C API中定义的4x4矩阵,它是double[4][4]上的typedef。API还提供了使用此矩阵的函数 API如下所示: typedef double ApiMatrix[4][4]; bool ApiMatrixFunction(ApiMatrix matrix) { // .. so
const\u cast
运算符。我已经搜索了这么多,但我真的找不到下面描述的问题的答案
具体来说,我要处理的是第三方C API中定义的4x4矩阵,它是double[4][4]
上的typedef
。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
作为引用(mycodeithref
)时,这种方法效果很好,但将其用作常量引用(mycodeithconstref
)会带来麻烦。可能的解决方法是复制函数中的变量,或者通过const\u cast(matrix.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);
}
typedef双APIMARX[4][4];
类矩阵{
APIA基质;
公众:
算子矩阵&()常数{
返回常数(a);
}
};
布尔APIMARX函数(APIMARX矩阵)
{
//…一些代码
返回true;
}
//使用MyMatrix引用
void MyCodeWithRef(矩阵和矩阵)
{
ApiMatrixFunction(矩阵);
}
//使用MyMatrix常量引用
void MyCodeWithConstRef(常数矩阵和矩阵)
{
ApiMatrixFunction(矩阵);
}
备选案文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));
}
typedef双APIMARX[4][4];
类矩阵{
APIA基质;
公众:
算子常数矩阵&()常数{
返回a;
}
};
布尔APIMARX函数(APIMARX矩阵)
{
//…一些代码
返回true;
}
//使用MyMatrix引用
void MyCodeWithRef(矩阵和矩阵)
{
常数ApiMatrix&a=矩阵;
ApiMatrixFunction(const_cast(a));
}
//使用MyMatrix常量引用
void MyCodeWithConstRef(常数矩阵和矩阵)
{
常数ApiMatrix&a=矩阵;
ApiMatrixFunction(const_cast(a));
}
如果mycodeithref
应该接受一个引用,为什么要在其中填充常量引用?我不明白为什么你认为需要“封装一个重载的常量强制转换操作符”。你不应该抛弃常数,除非你确定这个物体实际上不是常数。严格地说,您的mycodeithconstref
是代理,我忘了解释apimarixfunction不会改变矩阵。但由于这是一个C-API,所以它不使用常量APIMARX对象。我试图在代码中使用const引用,使其更具可读性。我很乐意在代码中使用const cast操作符,但它不应该直接访问内部数据,而应该通过这个cast操作符访问。不管怎样,当您想要丢弃const时,为什么要使用const引用?简单地说,不要让它再次成为常量,在大型项目中使用常量引用是一个可读性问题。C-API函数不具有这种技术,但是如果在矩阵中要改变,则在C++中添加抽象层。在<代码> >双[ 4 ] [4 ] < /代码>中,<代码> > COSTOSTCAST 不适用于我(C++ 11,VisualStudio 2010)。我不确定这是否是一个新的C++标准的工作,或者这是一个编译器错误。这个错误是用德语来解释的。我的翻译可能不完全符合英文输出:“1的参数从矩阵的转换[2] [4 ]。不可能。没有用户定义的转换运算符可以进行转换,或者该运算符不能被称为“运算符const ApiMatrix&(()const{return const_cast(m);}body返回ApiMatrix&运算符expect const ApiMatrix&)只需删除返回类型中的const即可)我不熟悉此语法:运算符ApiMatrix&()选项A中的const
和选项B中的该语法运算符const ApiMatrix&()const
。这是否有效?我在网上找不到它。它有什么作用?
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);
}
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));
}