Как перегрузить оператор () с двумя параметрами; как (3,5) - PullRequest
5 голосов
/ 25 декабря 2010

У меня есть класс математической матрицы. Он содержит функцию-член, которая используется для доступа к любому элементу класса.

template<class T>
class Matrix
{
    public:
        // ...
        void SetElement(T dbElement, uint64_t unRow, uint64_t unCol);
        // ...
};

template <class T>
void Matrix<T>::SetElement(T Element, uint64_t unRow, uint64_t unCol)
{
    try
    {
        // "TheMatrix" is define as "std::vector<T> TheMatrix"
        TheMatrix.at(m_unColSize * unRow + unCol) = Element;
    }
    catch(std::out_of_range & e)
    {
        // Do error handling here
    }
}

Я использую этот метод в своем коде так:

// create a matrix with 2 rows and 3 columns whose elements are double
Matrix<double> matrix(2, 3);
// change the value of the element at 1st row and 2nd column to 6.78
matrix.SetElement(6.78, 1, 2);

Это хорошо работает, но я хочу использовать перегрузку операторов для упрощения, как показано ниже:

Matrix<double> matrix(2, 3);
matrix(1, 2) = 6.78;    // HOW DO I DO THIS?

1 Ответ

3 голосов
/ 25 декабря 2010

Возвращает ссылку на элемент в перегруженном operator().

template<class T>
class Matrix
{
    public:
        T& operator()(uint64_t unRow, uint64_t unCol);

        // Implement in terms of non-const operator
        // to avoid code duplication (legitimate use of const_cast!)
        const T&
        operator()(uint64_t unRow, uint64_t unCol) const
        {
            return const_cast<Matrix&>(*this)(unRow, unCol);
        }
};

template<class T>
T&
Matrix<T>::operator()(uint64_t unRow, uint64_t unCol)
{
    // return the desired element here
}
...