Мне не удалось найти этот вопрос, и это реальная проблема, с которой я сталкиваюсь.
У меня есть утилита загрузки файлов, которая возвращает 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>.