индексирование — перегрузка оператора C ++ subscript []

Извините за формат, я никогда не публиковал сообщения на таком форуме, поэтому мне нужно немного научиться.

Моя проблема:
Я пишу шаблонный класс, и я хотел бы получить доступ к моим контейнерам через несколько видов [] операторы. Я немного читал в этой теме, поэтому я смог сделать одну перегрузку, но мне нужно еще немного:

Итак, в моем заголовочном файле, соответствующие вещи о моем контейнере:

template <class T>
class version_controlled_vector
{
int rev;
bool vector_state_changed;
std::vector< std::string > revision;
std::vector< std::vector<T> > v;//first one works ok, im satisfied with it:
std::vector<T>& operator[] (const int idx)
{
return v[idx];
}

//im not sure how to define the further one(s?):
T& operator[](const int idx2) const
{
return v[idx2];
}
//...and ofc some other code
};

// чтобы иметь эти использования в моем main.cpp:

version_controlled_vector<int> mi;
version_controlled_vector<std::string> ms;

//this works, and i d like to keep it,
5 == mi[ 0 ][ 0 ];

//and i d like to have these two usages too:
//getting the first character of the stored string:

'H' == ms[ 0 ][ 0 ];    // with the first overload from the header ms[0][0][0]
works  to get the first character of the string for eg "Hello"but, i have to use  the ms[0][0] format to achieve this

//and this:
4 == mi[ 0 ]; // i d like this as if it d behave like 4 == mi[0][0];

Я не понимаю, как я могу использовать single[] когда я сделал перегрузку, чтобы использовать [][]

Единственное решение, о котором я читал, это, возможно, постоянная перегрузка, но я совсем не уверен, я довольно слабый.

Спасибо за идеи!

2

Решение

Я думаю, что вы мутите интерфейс класса. Ожидания от класса:

  1. Получить i-е значение из j-й версии.
  2. Получить i-е значение из последней версии.
  3. Получите j-ую версию.

У вас есть возможность использовать перегруженный operator[] функция, чтобы получить эти значения, но будет лучше иметь функции, которые отражают интерфейс.

// Get the versionIndex-th version.
std::vector<T>& getVersion(int versionIndex);

// Get the itemIndex-th value from the versionIndex-th version.
T& getItem(int versionIndex, int itemIndex);

// Get the itemIndex-th value from the latest version.
T& getItem(int itemIndex);

Тогда реализация будет более простой и менее запутанной.

std::vector<T>& getVersion(int versionIndex)
{
// Make sure to add out of bound checks
return v[versinIndex];
}

T& getItem(int versionIndex, int itemIndex)
{
// Make sure to add out of bound checks
return v[versinIndex][itemIndex];
}

T& getItem(int itemIndex);
{
// Make sure to add out of bound checks
return v.back()[itemIndex];
}

Учитывая это, единственное operator[] это имеет смысл, по крайней мере для меня, это тот, который возвращает i-е значение из последней версии.

T& operator[](int itemIndex);
{
// Make sure to add out of bound checks
return v.back()[itemIndex];
}
1

Другие решения

Это немного сложно, вы должны понимать, что когда вы пишете

version_controlled_vector<int> mi;
5 == mi[0][0];

во время второго извлечения вы больше не обращаетесь к вашему version_controlled_vector класс, но внутреннее свойство этого и его тип std::vector<T> который имеет свой собственный оператор индекса, который вы вызываете во втором [0],

Для управления оператором нижнего индекса второй выборки вам нужно создать другой класс, производный от std::vector<T> и перегружен подстрочный оператор. Тогда вы должны использовать этот класс вместо std::vector в реализации version_controlled_vector,

0

По вопросам рекламы [email protected]