重载成员运算符,?

Overloading member operator,?

#include <iostream>
#include <vector>

struct Matrix;

struct literal_assignment_helper
{
    mutable int r;
    mutable int c;
    Matrix& matrix;

    explicit literal_assignment_helper(Matrix& matrix)
            : matrix(matrix), r(0), c(1) {}

    const literal_assignment_helper& operator,(int number) const;
};

struct Matrix
{
    int rows;
    int columns;
    std::vector<int> numbers;

    Matrix(int rows, int columns)
        : rows(rows), columns(columns), numbers(rows * columns) {}

    literal_assignment_helper operator=(int number)
    {
        numbers[0] = number;
        return literal_assignment_helper(*this);
    }

    int* operator[](int row) { return &numbers[row * columns]; }
};

const literal_assignment_helper& literal_assignment_helper::operator,(int number) const
{
    matrix[r][c] = number;

    c++;
    if (c == matrix.columns)
        r++, c = 0;

    return *this;
};


int main()
{
    int rows = 3, columns = 3;

    Matrix m(rows, columns);
    m = 1, 2, 3,
        4, 5, 6,
        7, 8, 9;

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
            std::cout << m[i][j] << ' ';
        std::cout << std::endl;
    }
}

此代码的灵感来自 matrix class in the DLib 库。

此代码允许分配以逗号分隔的文字值,如下所示:

Matrix m(rows, columns);
m = 1, 2, 3,
    4, 5, 6,
    7, 8, 9;

请注意,您不能这样做:

Matrix m = 1, 2, 3, ...

这是因为构造函数不能 return 引用另一个对象,这与 operator= 不同。

在此代码中,如果 literal_assignment_helper::operator, 不是 const,则此数字链接不起作用,逗号分隔的数字被认为是逗号分隔的表达式。

为什么运算符必须是常量?这里的规则是什么?

此外,operator, 不是 const 的影响是什么?它会被调用吗?

const literal_assignment_helper& operator,(int number) const;

辅助程序和 Matrix 中的逗号运算符,return const 引用。因此,要调用该引用的成员,成员 function/operator 必须是 const 限定的。

如果你删除所有常量,比如

literal_assignment_helper& operator,(int number);

这似乎也有效。