[英]Does C++ have an equivilent to Python's __setitem__
正如標題所要求的那樣,C ++是否具有類似於 Python的setitem和getitem的類?
基本上它允許你做類似以下的事情。
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.