Извините за формат, я никогда не публиковал сообщения на таком форуме, поэтому мне нужно немного научиться.
Моя проблема:
Я пишу шаблонный класс, и я хотел бы получить доступ к моим контейнерам через несколько видов []
операторы. Я немного читал в этой теме, поэтому я смог сделать одну перегрузку, но мне нужно еще немного:
Итак, в моем заголовочном файле, соответствующие вещи о моем контейнере:
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[]
когда я сделал перегрузку, чтобы использовать [][]
Единственное решение, о котором я читал, это, возможно, постоянная перегрузка, но я совсем не уверен, я довольно слабый.
Спасибо за идеи!
Я думаю, что вы мутите интерфейс класса. Ожидания от класса:
У вас есть возможность использовать перегруженный 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];
}
Это немного сложно, вы должны понимать, что когда вы пишете
version_controlled_vector<int> mi;
5 == mi[0][0];
во время второго извлечения вы больше не обращаетесь к вашему version_controlled_vector
класс, но внутреннее свойство этого и его тип std::vector<T>
который имеет свой собственный оператор индекса, который вы вызываете во втором [0]
,
Для управления оператором нижнего индекса второй выборки вам нужно создать другой класс, производный от std::vector<T>
и перегружен подстрочный оператор. Тогда вы должны использовать этот класс вместо std::vector
в реализации version_controlled_vector
,