Мне не удалось найти этот вопрос, и это реальная проблема, с которой я сталкиваюсь.
У меня есть утилита загрузки файлов, которая возвращает std::vector<unsigned char>
, содержащую содержимое всего файла.
Однако для функции обработки требуется массив contiguos 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 the problem!
cache = LoadFile("file.txt");
_dataOperation(cache);
}
};
Этот код не компилируется, потому что (очевидно) нет соответствующего преобразования. Однако мы можем быть уверены, что временный вектор будет иметь одинаковую память (IOW sizeof(char) == sizeof(unsigned char)
)
Наивным решением было бы перебрать содержимое временного и бросить каждого персонажа. Я знаю, что в нормальном случае вызывается operator= (T&&)
.
В моей ситуации безопасно делать переинтерпретирование, потому что я уверен, что я буду читать только символы ASCII. В любом случае любой другой персонаж попадает в _dataOperation
.
Итак, мой вопрос: как правильно и безопасно преобразовать временный вектор таким образом, который не требует копирования?
Если это невозможно, я предпочел бы безопасный способ копирования, а не небезопасную обработку. Я также мог бы изменить LoadFile
, чтобы вернуть либо vector<char>
, либо vector<unsigned char>
.