Есть ли способ реализовать оператор, не являющийся членом [], в C ?

#c #vector #operator-overloading #structure #std

Вопрос:

Я написал структуру для поддержания состояния игры в крестики-нолики.

 struct Board{
    std::vector<std::vector<int>> board;

    Board() {
        board = std::vector<std::vector<int>> (3, std::vector<int> (3));
    }

    std::vector<int> amp; operator[](int id) { return board[id]; }
    int amp; operator[](std::pair<int, int> pos) { return board[pos.first][pos.second]; }
};
 

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

 Board position;
position[1][2]   ;
position[std::make_pair(0, 0)] --;
 

Затем я понял, что, возможно, было бы неплохо иметь какой-то более общий оператор для двумерного вектора, чтобы извлечь значение в некоторой позиции из пары целых чисел (что-то вроде этого).

 int amp; operator [] (std::vector<std::vector<int>> amp; vec, std::pair<int, int> amp; p) { return vec[p.first][p.second]; }
 

Но затем я столкнулся со следующим утверждением компилятора:

 stack.cpp:15:7: error: ‘intamp; operator[](std::vector<std::vector<int> >amp;, std::pair<int, int>amp;)’ must be a nonstatic member function
   15 | int amp; operator [] (std::vector<std::vector<int>> amp; vec, std::pair<int, int> amp; p) { return vec[p.first][p.second]; }
      |       ^~~~~~~~
 

Есть ли способ реализовать что-то с описанной выше функциональностью?

Комментарии:

1. Как говорится в сообщении об ошибке, operator[] должна быть нестатическая функция-член. Так что нет никакого способа написать его как не являющегося участником.

2. Нет, ты не можешь. Вы могли бы добавить такой оператор для Board класса, но я бы не рекомендовал этого делать. Это не распространенный способ перегрузки operator[] в C , и необычные перегрузки операторов часто создают трудночитаемый код.

3. position.at(0, 0) для меня это выглядит более естественным, чем ваш синтаксис, и его легко реализовать.

4. Кроме того, использование пары для ваших координат не очень читабельно. Просто создайте структуру для позиции с элементами x и y (или буквой и цифрой, если ваша доска похожа на шахматную доску). И тогда вы можете написать Доска доска; Позиция pos{1,1}; board.at(должность);

5. Я спрашиваю, потому что, хотя, возможно, менее читаемый, этот подход может ускорить некоторые реализации, когда дело доходит до конкурентного программирования (как иногда, мне приходится писать две отдельные функции, которые делают одно и то же (для пары и только двух целых чисел)).