簡體   English   中英

C ++是否與Python的__setitem__等效

[英]Does C++ have an equivilent to Python's __setitem__

正如標題所要求的那樣,C ++是否具有類似於 Python的setitemgetitem的類?

基本上它允許你做類似以下的事情。

MyClass anObject;

anObject[0] = 1;
anObject[1] = "foo";

基本上,你重載下標運算符( operator[] ),它返回一個引用(所以它可以讀取和寫入)

您可以重載[]運算符,但它與單獨的getitem / setitem方法對不完全相同,因為您無法為獲取和設置指定不同的處理。

但是你可以通過返回一個覆蓋賦值運算符的臨時對象來接近。

要擴展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";
}

它不可移植,但MSVC有__declspec(屬性) ,它也允許索引器:

struct Foo
{
   void SetFoo(int index, int value) { ... }
   int GetFoo(int index) { ... }

   __declspec(property(propget=GetFoo, propput=SetFoo)) int Foo[]; 
}

除此之外,Earwicker確實概述了便攜式解決方案,但他說你會遇到很多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM