У меня есть большая кодовая база, изначально C, перенесенная на C ++ много лет назад, которая работает с несколькими большими массивами пространственных данных. Эти массивы содержат структуры, представляющие точечные и треугольные объекты, которые представляют модели поверхностей. Мне нужно реорганизовать код так, чтобы конкретный способ внутреннего хранения этих объектов различался для конкретных сценариев. Например, если точки лежат на регулярной плоской сетке, мне не нужно хранить координаты X и Y, так как они могут быть вычислены на лету, как и треугольники. Точно так же я хочу воспользоваться преимуществами таких основных инструментов, как STXXL для хранения. Самый простой способ сделать это - заменить доступ к массиву функциями типа put и get, например,
point[i].x = XV;
становится
Point p = GetPoint(i);
p.x = XV;
PutPoint(i,p);
Как вы можете себе представить, это очень утомительный рефакторинг с большой кодовой базой, подверженный всевозможным ошибкам в пути. Я хотел бы написать класс, который имитирует массив, перегружая оператор []. Поскольку массивы уже находятся в куче и перемещаются с помощью reallocs, код уже предполагает, что ссылки на массив, такие как
point *p = point + i;
не может использоваться. Можно ли написать этот класс? Например, написание методов ниже в терминах оператора [];
void MyClass::PutPoint(int Index, Point p)
{
if (m_StorageStrategy == RegularGrid)
{
int xoffs,yoffs;
ComputeGridFromIndex(Index,xoffs,yoffs);
StoreGridPoint(xoffs,yoffs,p.z);
} else
m_PointArray[Index] = p;
}
}
Point MyClass::GetPoint(int Index)
{
if (m_StorageStrategy == RegularGrid)
{
int xoffs,yoffs;
ComputeGridFromIndex(Index,xoffs,yoffs);
return GetGridPoint(xoffs,yoffs); // GetGridPoint returns Point
} else
return m_PointArray[Index];
}
}
Меня беспокоит то, что все классы массивов, которые я видел, имеют тенденцию передавать по ссылке, тогда как я думаю, что мне придется передавать структуры по значению. Я думаю, что это должно работать, а не производительность, кто-нибудь может увидеть какие-либо серьезные подводные камни с этим подходом. нотабене причина, по которой я должен передать значение, это получить
point[a].z = point[b].z + point[c].z
для правильной работы там, где изменяется базовый тип хранилища.