私は、何年も前にもともと C を C++ に移植した大規模なコード ベースを持っており、空間データの多数の大規模な配列を操作しています。これらの配列には、サーフェス モデルを表す点および三角形のエンティティを表す構造体が含まれています。これらのエンティティが内部に格納される特定の方法が特定のシナリオで異なるように、コードをリファクタリングする必要があります。たとえば、ポイントが通常の平らなグリッド上にある場合、X 座標と Y 座標を保存する必要はありません。三角形と同様に、その場で計算できるからです。同様に、ストレージ用のSTXXLなどのコア ツール以外を活用したいと考えています。これを行う最も簡単な方法は、配列アクセスを put および get 型の関数に置き換えることです。
point[i].x = XV;
になる
Point p = GetPoint(i);
p.x = XV;
PutPoint(i,p);
ご想像のとおり、これは大規模なコード ベースでの非常に面倒なリファクタリングであり、途中であらゆる種類のエラーが発生しがちです。私がやりたいのは、[] 演算子をオーバーロードして配列を模倣するクラスを作成することです。配列はすでにヒープ上に存在し、再割り当てで移動するため、コードは次のような配列への参照を既に想定しています。
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];
}
}
私の懸念は、私が見たすべての配列クラスが参照渡しになる傾向があることですが、構造体は値渡しする必要があると思います。パフォーマンス以外にも機能するはずだと思いますが、このアプローチで大きな落とし穴を見つけることができる人はいますか? nb値で渡さなければならない理由は、取得することです
point[a].z = point[b].z + point[c].z
基になるストレージ タイプが異なる場合に正しく動作するようにします。