带有操作符重载的c++矩阵类
C++ Matrix Class with Operator Overloading
我正在实现一个小的密集矩阵类,而不是计划get/set操作符,我想使用操作符重载,使API更可用和一致。
我想达到的目标很简单:
template<typename T>
class Matrix
{
public:
/* ... Leaving out CTOR and Memory Management for Simplicity */
T operator() (unsigned x, unsigned y){/* ... */ }
};
Matrix<int> m(10,10);
int value = m(5,3); // get the value at index 5,3
m(5,3) = 99; // set the value at index 5,3
虽然通过重载operator()
可以直接获得值,但我无法理解如何定义setter。根据我的理解,操作符优先级将在赋值之前调用operator()
,但是不可能重载operator()
以返回正确的左值。
解决这个问题的最好方法是什么?
我不同意"it's not possible"去做正确的事情:
struct Matrix
{
int & operator()(size_t i, size_t j) { return data[i * Cols + j]; }
const int & operator()(size_t i, size_t j) const { return data[i * Cols + j]; }
/* ... */
private:
const size_t Rows, Cols;
int data[Rows * Cols]; // not real code!
};
现在你可以说,m(2,3) = m(3,2) = -1;
等
你的问题的答案是Kerrek已经说过的:你可以通过改变操作符的签名来提供重载,在这种情况下,可以通过修改函数的const-ness来实现。
但是我建议您至少考虑为这些值提供一个单独的setter。原因是,一旦返回对内部数据结构的引用,就失去了对外部代码对数据所做操作的控制。也许是好的在这种情况下,但考虑,如果你决定添加范围验证实现(即确认没有价值上面的矩阵X或Y)以下,或者希望优化计算的矩阵(说的和所有的元素在矩阵是一个经常检查值,你想优化掉预缓存值的计算和更新每个字段变化),这是更容易控制的方法设置接收价值。
相关文章:
- 为什么map有操作符[],set没有
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- c++新操作符通过libstdc++占用大量内存(67MB)
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- 提升::精神::因果报应使用有条件的替代操作符(|)
- 促进几何体操作符
- 如果操作符delete没有实现,为什么不编译它
- 在使用放置新操作符时,我真的需要担心对齐问题吗
- 我怎样才能让getline操作符工作
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- 操作符的大小在C++
- 如何将向量中的对象传递给操作符
- 一个更容易的拷贝分配操作符实现
- 如何重写复杂的c++代码行(嵌套的三元操作符)
- boost::make_shared没有调用(放置)操作符new
- 新操作符(以及malloc)无法分配~450MB的内存
- 类、异常和操作符
- 当delete操作符释放内存时,我为什么需要析构函数