C++有没有相当于Python的__setitem__?

2 投票
4 回答
1161 浏览
提问于 2025-04-15 14:47

就像标题问的那样,C++有没有类似于Python中setitemgetitem的功能,用于类的操作呢?

简单来说,这个功能可以让你做一些类似下面的事情。

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[]),这样它就会返回一个引用(这意味着你可以既读取它的值,也可以对它进行写入)。

撰写回答