gpt4 book ai didi

c++ - C++ 中的 vector 、代理类和点运算符

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:06 26 4
gpt4 key购买 nike

一个与 C++ 中的自定义 Vector 类相关的问题。

template <typename T>
class Vector
{ ...
private:
T * mData; int mSize;
public:
proxy_element operator[](const size_type index) { return proxy_element(*this, index); }
const T& operator[](const size_type index) const { return mData[index]; }
};

template <typename T>
class proxy_element
{ ...
proxy_element(Vector<T>& m_parent, const size_type index);
proxy_elem& operator=(const T& rhs); // modifies data so invalidate on other memories
bool operator==(const proxy_elem& rhs) // only read, just copy data back.
...
}

使用 proxy_element 类的原因是为了区分和优化读写操作,考虑到 vector 数据也可以驻留在 GPU 设备内存中。因此,任何读取操作只需要将最新数据复制回来(如果有的话),但读写操作需要使设备内存中的数据无效。

当元素类型是原始类型时,这种设计效果很好。然而,对于更复杂的元素类型,存在一个问题:

struct person{ int age; double salary; }; 
int main()
{
Vector<person> v1(10);
v[1].age = 10; // gives error as operator[] returns proxy_element for which "." operator has no meaning
}

据我所知,“.”运算符不能在 C++ 中重载。一个明显的解决方案是不使用 proxy_elem 并只返回常规引用 (T &),假设每次访问都是写访问,但由于显而易见的原因,这将是低效的。

是否有任何其他解决方法可以给我“。”运算符(operator)在保持区分读写操作的能力的同时工作?

最佳答案

一个选择是使此类数据类型不可变(私有(private)成员变量,由构造函数初始化,唯一的 setter 是类的赋值运算符)。这样,更改任何内容的唯一方法是分配给类的整个实例,可以通过 proxy_element 进行引导。

关于c++ - C++ 中的 vector 、代理类和点运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182963/

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