ソース std::string オブジェクトをコピーしたり保持したりせずに、std::string char データの所有権を取得するにはどうすればよいですか? (移動セマンティクスを使用したいのですが、異なるタイプ間で。)
私は C++11 ClangコンパイラとBoostを使用しています。
基本的に、これと同等のことをしたい:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
明確にするために、 std::string: を取り除く必要があります。このコードは、文字列データとバイナリ データの両方を処理し、同じ形式で処理する必要があります。そして、std::string で動作する別のコード レイヤーからデータが取得されるため、std::string からのデータが必要です。
私がやりたいと思っている場所をより詳しく説明するには、たとえば、書き込みのためにユーザーから std::string とバイナリデータの両方を取得できる非同期ソケットラッパーを持っています。両方の "API" 書き込みバージョン (std::string または行バイナリ データを取る) は、内部的に同じ (バイナリ) 書き込みに解決されます。文字列が長くなる可能性があるため、コピーを避ける必要があります。
WriteId write( std::unique_ptr< std::string > strToWrite )
{
// Convert std::string data to contiguous byte storage
// that will be further passed along to other
// functions (also with the moving semantics).
// strToWrite.c_str() would be a solution to my problem
// if I could tell strToWrite to simply give up its
// ownership. Is there a way?
unique_ptr<std::vector<char> > dataToWrite= ??
//
scheduleWrite( dataToWrite );
}
void scheduledWrite( std::unique_ptr< std::vecor<char> > data)
{
…
}
この例の std::unique_ptr は、所有権の譲渡を説明するためのものです。同じセマンティクスを持つ他のアプローチは、私にとっては問題ありません。
この特定のケース (std::string char バッファーを使用) の解決策と、文字列、ストリーム、および同様の一般的なこの種の問題の解決策について疑問に思っています: 文字列、ストリーム、std コンテナー、およびバッファー型の間でバッファーを移動する方法のヒント
また、コピーせずに異なる API/タイプ間でバッファ データを渡す場合のヒントと C++ 設計アプローチおよび特定のテクニックとのリンクをいただければ幸いです。私はストリームを使用していませんが、その件については不安定なので、言及していません。