std::byte
- это новый тип в С++ 17, который выполнен как enum class byte : unsigned char
. Это делает невозможным его использование без соответствующего преобразования. Итак, я сделал псевдоним для вектора такого типа для представления массива байтов:
using Bytes = std::vector<std::byte>;
Однако его нельзя использовать в старом стиле: функции, которые принимают его как параметр, терпят неудачу, потому что этот тип не может быть легко преобразован в старый тип std::vector<unsigned char>
, например, использование библиотеки zipper
/resourcecache/pakfile.cpp: In member function 'utils::Bytes resourcecache::PakFile::readFile(const string&)':
/resourcecache/pakfile.cpp:48:52: error: no matching function for call to 'zipper::Unzipper::extractEntryToMemory(const string&, utils::Bytes&)'
unzipper_->extractEntryToMemory(fileName, bytes);
^
In file included from /resourcecache/pakfile.hpp:13:0,
from /resourcecache/pakfile.cpp:1:
/projects/linux/../../thirdparty/zipper/zipper/unzipper.h:31:10: note: candidate: bool zipper::Unzipper::extractEntryToMemory(const string&, std::vector<unsigned char>&)
bool extractEntryToMemory(const std::string& name, std::vector<unsigned char>& vec);
^~~~~~~~~~~~~~~~~~~~
/projects/linux/../../thirdparty/zipper/zipper/unzipper.h:31:10: note: no known conversion for argument 2 from 'utils::Bytes {aka std::vector<std::byte>}' to 'std::vector<unsigned char>&'
Я попытался выполнить наивные броски, но это тоже не помогает. Итак, если он предназначен для того, чтобы быть полезным, будет ли он действительно полезным в старых контекстах? Единственный метод, который я вижу, - использовать std::transform
для использования нового вектора байтов в этих местах:
utils::Bytes bytes;
std::vector<unsigned char> rawBytes;
unzipper_->extractEntryToMemory(fileName, rawBytes);
std::transform(rawBytes.cbegin(),
rawBytes.cend(),
std::back_inserter(bytes),
[](const unsigned char c) {
return static_cast<std::byte>(c);
});
return bytes;
Что есть:
- Гадкий.
- Делает много бесполезных строк (может быть перезаписано, но все же это нужно написать до:)).
- Копирует память вместо использования уже созданного фрагмента
rawBytes
.
Итак, как использовать его в старых местах?