std::byte
est un nouveau type en C++17 qui se présente sous la forme de enum class byte : unsigned char
. Il est donc impossible de l'utiliser sans une conversion appropriée. J'ai donc créé un alias pour le vecteur de ce type afin de représenter un tableau d'octets :
using Bytes = std::vector<std::byte>;
Cependant, il est impossible de l'utiliser dans l'ancien style : les fonctions qui l'acceptent comme paramètre échouent parce que ce type ne peut pas être facilement converti dans l'ancien style. std::vector<unsigned char>
par exemple, une utilisation de zipper
bibliothèque :
/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>&'
J'ai essayé d'effectuer des moulages naïfs, mais cela ne m'a pas aidé non plus. Donc, si cette méthode est conçue pour être utile, sera-t-elle réellement utile dans les anciens contextes ? La seule méthode que je vois est d'utiliser std::transform
pour l'utilisation d'un nouveau vecteur d'octets à ces endroits :
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;
C'est-à-dire :
- Moche.
- Cela prend beaucoup de lignes inutiles (qui peuvent être réécrites mais qui doivent être écrites avant :)).
- Copie la mémoire au lieu d'utiliser un morceau de mémoire déjà créé.
rawBytes
.
Alors, comment l'utiliser dans des lieux anciens ?