#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. Я спрашиваю, потому что, хотя, возможно, менее читаемый, этот подход может ускорить некоторые реализации, когда дело доходит до конкурентного программирования (как иногда, мне приходится писать две отдельные функции, которые делают одно и то же (для пары и только двух целых чисел)).