必要なのは、データのブロブ全体をコピーせずに読み取り専用アクセスを行うことです。いくつかのオプションがあります。
まず、上記のように、データ コンテナーが何であれ const 参照を返すことができます。
const std::vector<T>& getData() { return mData; }
これには具体性という欠点があります。クラスのインターフェースを変更せずにデータを内部に保存する方法を変更することはできません。
次に、実際のデータへの const 化されたポインターを返すことができます。
const T* getDataAt(size_t index)
{
return &mData[index];
}
これは少し優れていますが、getNumItems 呼び出しを提供し、範囲外のインデックスから保護する必要もあります。また、ポインターの const-ness は簡単にキャストされ、データは読み書き可能になりました。
もう 1 つのオプションは、イテレータのペアを提供することですが、これはもう少し複雑です。これにはポインターと同じ利点があり、(必ずしも) getNumItems 呼び出しを提供する必要がなく、イテレーターから const-ness を取り除くためにかなり多くの作業が必要になります。
おそらくこれを管理する最も簡単な方法は、Boost Range を使用することです。
typedef vector<T>::const_iterator range_iterator_type;
boost::iterator_range< range_iterator_type >& getDataRange()
{
return boost::iterator_range(mData.begin(), mData.end());
}
これには、ウェブサイトでわかるように、範囲が構成可能、フィルター可能などであるという利点があります。