私はその質問を見つけることができませんでした、そしてそれは私が直面している実際の問題です。
std::vector<unsigned char>
ファイルの内容全体を含むファイル読み込みユーティリティがあります。ただし、処理関数にはの連続配列が必要ですchar
(これは変更できません。これはライブラリ関数です)。とにかく処理関数を使用しているクラスはデータのコピーを格納するので、として格納したいと思いvector<char>
ます。これがもう少しわかりやすいコードです。
std::vector<unsigned char> LoadFile (std::string const& path);
class Processor {
std::vector<char> cache;
void _dataOperation(std::vector<char> const& data);
public:
void Process() {
if (cache.empty())
// here's the problem!
cache = LoadFile("file.txt");
_dataOperation(cache);
}
};
(明らかに)適切な変換がないため、このコードはコンパイルされません。ただし、一時ベクトルが同じ量のメモリ(IOW sizeof(char) == sizeof(unsigned char)
)を占有することは確かです。
素朴な解決策は、一時的なコンテンツを繰り返し処理し、すべてのキャラクターをキャストすることです。通常の場合、operator= (T&&)
が呼び出されることを私は知っています。
私の状況では、ASCII文字のみを読み取ると確信しているため、変換を再解釈しても安全です。_dataOperation
とにかく他のキャラクターは捕まるでしょう。
だから、私の質問は:コピーを伴わない方法で一時的なベクトルを適切かつ安全に変換する方法は?
それが不可能な場合は、安全でない非コピーよりも安全なコピー方法をお勧めします。またはLoadFile
を返すように変更することもできます。vector<char>
vector<unsigned char>