【发布时间】:2011-08-24 22:14:04
【问题描述】:
一个与 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类的原因是为了区分和优化读写操作,考虑到向量数据也可以驻留在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
}
AFAIK,“。”运算符在 C++ 中不能重载。一个明显的解决方案是不使用 proxy_elem 而只返回常规引用 (T &),假设每次访问都是写访问,但由于显而易见的原因,这将是低效的。
是否有任何其他工作可以让我“。”操作员在工作的同时保留区分读写操作的能力?
【问题讨论】:
-
在更复杂类型的情况下是否可以使用指针?然后你也许可以通过重载 operator->. 来解决你的问题
-
@TeaWolf:谢谢。我知道该选项,但正在寻找使其适用于常规类型。