gpt4 book ai didi

C++下标[]运算符重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:11 25 4
gpt4 key购买 nike

抱歉格式问题,我从来没有真正在这样的论坛上发帖,所以我必须学习一下操作方法。

我的问题是:我正在编写一个模板类,我想通过多种 [] 运算符访问我的容器。我读了一些关于这个主题的内容,所以我已经能够重载一个,但我还需要更多:

所以在我的头文件中,与我的容器相关的东西:

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[]

我读到的唯一解决方案可能是常量重载,但我一点也不确定,我是个弱者。

谢谢你的想法!

最佳答案

我认为你在混淆类的接口(interface)。类(class)的期望是:

  1. 从第 j 个版本中获取第 i 个值。
  2. 从最新版本中获取第 i 个值。
  3. 获取第 j 个版本。

您可以选择使用重载的 operator[] 函数来获取这些值,但是,拥有反射(reflect)接口(interface)的函数会更好。

// 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];
}

关于C++下标[]运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24480691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com