ホストアプリケーションのSTLコンテナに保存されているデータにアクセスする必要があるDLLがあります。C ++には標準のABIがなく、さまざまなコンパイラをサポートしたいので、アプリケーションとDLLの間のインターフェイスは、基本的にプレーンな古いデータのままにする必要があります。
ベクトルの場合、これは比較的簡単です。ベクトルのメモリブロックは連続していることが保証されているため、単純に返すことができます。
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
これで、DLLは、そのインターフェイスを介してベクターのデータに安全に読み取り専用でアクセスできるようになります。DLLはこれをラップして、コンテンツをそれ自体のベクターにコピーすることもできます。
STLリスト(および両端キュー)はどうですか?DLL境界を介したアクセスを許可する別の簡単な方法はありますか?それとも、ある種のGetFirst()/ GetNext()インターフェイスに頼る必要がありますか?多くのリストに対してこれを行う必要があるかもしれないので、ベクトルのような単純なソリューションがあると便利です。