是否重载索引运算符以模拟POD多维数组
Overload index operator to mimic POD multi-dimensional array?
我有一个现有的类,它的结构如下:
class Matrix
{
public:
float Data[4][4];
// ... methods
};
并随后以以下方式使用:
Matrix m;
m.Data[0][0] = 1.0f;
float local = m.Data[0][0];
//...
我想用重载的索引运算符替换Data
成员,这样我就可以对所使用的索引执行范围检查。虽然我可以更改Matrix
类本身及其成员函数的实现,但我不能修改其在现有代码中的用法,因此任何解决方案都要求用法语法保持相同。同样希望该解决方案不改变sizeof(Matrix)
。有办法做到这一点吗?
对于这类事情,通常需要使用代理类来处理第二个索引运算符。它看起来像这样,并进入Matrix
类的private
部分。我不做越界检查(你自己加应该不难(。
class Proxy {
Matrix& ref;
size_t i;
public:
Proxy(Matrix& on, size_t i) : ref(on), i(i) {}
float operator[] (size_t j) {
return ref.Data[i][j];
}
};
然后让Matrix::operator[]
返回这个类的一个实例:
Proxy operator[] (size_t i) {
return Proxy(*this, i);
}
请注意,如果您想要一个const重载(即,您想要在const Matrix
对象上使用索引运算符(,则需要一个单独的ConstProxy类,该类具有const Matrix& ref
而不是Matrix& ref
,但在其他方面是相同的。
还可以选择返回对数组的引用。(注意:正如其中一条评论所指出的,这对绑定检查没有多大帮助,但我认为这很有趣,所以我将把它留在这里。(
float (&operator[](size_t i))[4] {
return Data[i];
}
它的语法非常晦涩,我相信它在VisualStudio2013中不起作用,但你可以用typedef让它更干净。
using Proxy = float[4];
Proxy& operator[](size_t i) {
return Data[i];
}
如果你不介意放弃方括号索引,还有一个选择。你可以像这样重载函数调用操作符:
float operator()(size_t i, size_t j) {
return Data[i][j];
}
另一种方法是定义具有向量语义的代理类
class Matrix
{
public:
struct SubMatrix
{
class Vector
{
public:
Vector(float *data) : Data(data) {}
float &operator[](int index) { return Data[index]; }
private:
float *Data;
};
Vector operator[](int index)
{
return Vector(Data[index]);
}
float Data[4][4];
};
SubMatrix Data;
// ... methods
};
然后你可以这样使用它:
Matrix m;
float f = m.Data[1][2];
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 使用 Python、C++ 和 pybind11 返回并传递原始 POD 指针(数组)
- 如何遍历可变参数模板以填充 POD 数组
- 初始化POD数组中的第一个元素,保持其余元素未初始化
- 用 std::valarray 替换 POD C 样式数组是个坏主意吗?
- Pod 到 Array 的结构的 memcpy 数组
- 如何使用C++中的括号语法初始化POD数组
- 如何返回具有大小的POD数组引用
- 从动态创建的数组构造pod对象时,是否推荐使用placement new ?
- 如何用pod数组打包用户定义的c++类
- 是否重载索引运算符以模拟POD多维数组