C++ C++;多维数组的const_cast算子

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

我正在C++11中寻找一种方法,为定义成员操作的结构/类的多维数组成员封装重载的
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));
}