std::vector を CComSafeArray に変換する簡単な方法はありますか。私は現在、基本的に 5 または 6 ベクトルを CComSafeArray に変換するコードを作成しています (反復ではありません)。その中で、コードの大きなブロック(古いスペースの解放、新しいセーフアレイの作成、コピー)が出現します。簡単に変換できるといいのですが。
この変換を行うメソッドを書くことができるので、ライブラリなどの隅にある便利な関数を実際に探しています。
これにより、ベクトルの内容が単純な型またはポインターであると仮定して、基礎となる SAFEARRAY に直接コピーされます。
vector<T> vecInput;
// Create a SAFEARRAY of size elements
CComSafeArray<T> sa(vecInput.size());
// Copy all the contents into the SAFEARRAY
memcpy(&sa.GetSafeArrayPtr()->pvData[0], &vecInput[0], sizeof(T) * vecInput.size());
一般化されたソリューションを探している場合は、ベクトルを反復処理することもできます。
vector<T> vecInput;
// Create a SAFEARRAY of size elements
CComSafeArray<T> sa(vecInput.size());
// Copy all the contents into the SAFEARRAY
for (size_t i = 0; i < vecInput.size(); ++i)
sa.SetAt(i, vecInput[i]);
STL アルゴリズムを使用する場合は、SAFEARRAY の上に STL 準拠の反復子を提供するソリューションが少なくとも1 つあります。その後CComSafeArray::Attach
、SAFEARRAY を CComSafeArray に割り当てるために呼び出すことができます。