Re: How to return a reference, when I really need it
On 31 Jul., 14:27, BlackLight wrote:
Vector Matrix::operator[] (size_t i) throw() {
if (i >= rows)
throw InvalidMatrixIndexException();
vector<float> row;
for (int j=0; j < cols; j++)
row.push_back(matrix[i][j]);
return Vector(row);
}
What's the type of matrix? If it's a std::vector<Vector> you can
simply write
Vector& Matrix::operator[](size_t i)
{
if (i >= rows) throw InvalidMatrixIndexException();
return matrix[i];
}
Also, don't forget const overloads:
Vector const& Matrix::operator[](size_t i) const
{
if (i >= rows) throw InvalidMatrixIndexException();
return matrix[i];
}
If it is something different you can return a proxy -- your own "row
vector reference" so to speak.
class MatrixRowVectorRef
{
private:
Matrix & mat; // a reference member disables the...
size_t i; // compiler-generated assignment operator
public:
MatrixRowVectorRef(Matrix & m, size_t i)
: mat(m), i(i) {}
size_t size() const {
return mat.columns();
}
float& operator[](size_t j) const {
return mat[i][j];
}
template<typename VectorExpression>
MatrixRowVectorRef& operator=(VectorExpression const& ve)
{
if (ve.size() != mat.columns()) throw Something();
// auto && row = mat[i];
for (size_t j=0, e=ve.size(); j<e; ++j) {
mat[i][j] = ve[j];
// alternativly: row[j] = ve[j];
}
}
}
and another version for a reference to const:
class MatrixRowVectorConstRef
{
private:
Matrix const & mat;
...
You may also want to use the function call operator for accessing a
matrix' element:
float& operator()(size_t i, size_t j) {
return matrix[i][j];
}
You may also want to checkout the "Boost uBLAS" library. It takes some
getting used to, though. It's heavy on template trickery and you have
to understand the "concept of concepts". The exact types are less
important than the concepts the types model.
Cheers!
SG