К сожалению, нет, прямого способа создания такой ссылки нет, потому что компилятор обрабатывает это как
a.operator[] (/* ... don't know ... */).operator[] (x);
Это имеет смысл, только если первый вызов operator []
фактически возвращает vector
.
Однако вы можете подделать это поведение, введя новый класс, который специально обрабатывает это поведение.Идея состоит в том, чтобы этот класс сохранял второй индекс и предоставлял функцию operator[]
, которая, учитывая первый индекс, ищет реальное значение в vector
.Вот один пример:
class IndexReverser { // Or, your favorite name
public:
IndexReverser(vector< vector<int> >& v, size_t index);
int& operator[] (size_t firstIndex);
private:
vector< vector<int> >& realVector;
const size_t secondIndex;
};
IndexReverser::IndexReverser(vector< vector<int> >&v,
size_t index) : realVector(v), secondIndex(index) {
// Handled in initialization list
}
int& IndexReverser::operator[] (size_t firstIndex) {
return realVector[firstIndex][secondIndex];
}
Затем вы могли бы написать, например, следующее:
IndexReverser ir(a, j);
ir[i] = 137;
Возможно, вам потребуется предоставить класс-близнец для обработки const
векторов, и, вероятно,хотите параметризовать всю структуру в зависимости от типа хранимых элементов.Я не уверен, что это то, что вы ищете, но это как минимум показывает, что в принципе вы можете получить желаемое поведение.