C++有没有相当于Python的__setitem__?
就像标题问的那样,C++有没有类似于Python中setitem和getitem的功能,用于类的操作呢?
简单来说,这个功能可以让你做一些类似下面的事情。
MyClass anObject;
anObject[0] = 1;
anObject[1] = "foo";
4 个回答
1
为了进一步解释Earwicker的帖子:
#include <string>
#include <iostream>
template <typename Type>
class Vector
{
public:
template <typename Element>
class ReferenceWrapper
{
public:
explicit ReferenceWrapper(Element& elem)
: elem_(elem)
{
}
// Similar to Python's __getitem__.
operator const Type&() const
{
return elem_;
}
// Similar to Python's __setitem__.
ReferenceWrapper& operator=(const Type& rhs)
{
elem_ = rhs;
return *this;
}
// Helper when Type is defined in another namespace.
friend std::ostream& operator<<(std::ostream& os, const ReferenceWrapper& rhs)
{
return os << rhs.operator const Type&();
}
private:
Element& elem_;
};
explicit Vector(size_t sz)
: vec_(sz)
{
}
ReferenceWrapper<const Type> operator[](size_t ix) const
{
return ReferenceWrapper<const Type>(vec_[ix]);
}
ReferenceWrapper<Type> operator[](size_t ix)
{
return ReferenceWrapper<Type>(vec_[ix]);
}
private:
std::vector<Type> vec_;
};
int main()
{
Vector<std::string> v(10);
std::cout << v[5] << "\n";
v[5] = "42";
std::cout << v[5] << "\n";
}
6
你可以重载(也就是重新定义)方括号操作符([]),但这和单独的获取(getitem)和设置(setitem)方法有点不同,因为你不能为获取和设置指定不同的处理方式。
不过,你可以通过返回一个临时对象来接近这个效果,这个临时对象可以重写赋值操作符。
7
基本上,你需要重载下标操作符(operator[]
),这样它就会返回一个引用(这意味着你可以既读取它的值,也可以对它进行写入)。