Вопрос, связанный с пользовательским классом Vector в C ++.
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 &), предполагая, что каждый доступ является доступом для записи, но это будет неэффективно по очевидным причинам.
Есть ли какая-то другая работа, которая дает мне "." оператор работает, сохраняя способность различать операции чтения и записи?