std::byte
是C++ 17中的新类型,它是作为enum class byte : unsigned char
.如果没有适当的转换,这将无法使用它.所以,我为这种类型的向量做了一个别名来表示一个字节数组:
using Bytes = std::vector<std::byte>;
Run Code Online (Sandbox Code Playgroud)
但是,它不可能在旧式中使用它:接受它作为参数的函数失败,因为这种类型不能轻易转换为旧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>&'
Run Code Online (Sandbox Code Playgroud)
我试图表演天真的演员,但这也没有帮助.那么,如果它被设计为有用,它在旧的上下文中是否真的有用?我看到的唯一方法是 …
最近添加std::byte
到C++ 17让我想知道为什么这种类型甚至被添加到标准中.即使在阅读了cppreference参考文献后,它的用例似乎也不清楚.
我能想出的唯一用例是它更明确地表达了意图,因为它std::byte
应该只被视为一个比特集合而不是像char
以前用于两个目的的字符类型.意思是:
这个:
std::vector<std::byte> memory;
Run Code Online (Sandbox Code Playgroud)
比这更明确:
std::vector<char> memory;
Run Code Online (Sandbox Code Playgroud)
这是唯一的用例以及它被添加到标准中的原因还是我错过了一个重点?
此问题旨在使用std::byte
标准输入输出.
是否有计划增加适当的功能重载read(_bytes)
和write(_bytes)
到的接口basic_istream<CharT>
,并basic_ostream<CharT>
在将来的标准是什么?有什么理由反对呢?我知道CharT*
应该保留-overloads.我该怎么办std::byte
?我目前在我的项目功能中定义
std::istream& read(std::istream&, std::byte*, std::streamsize)
std::ostream& write(std::ostream&, const std::byte*, std::streamsize)
Run Code Online (Sandbox Code Playgroud)
这些使用reinterpret_cast<>
到char*
RESP.const char*
但我相信这取决于它的大小char
.我错了吗?是char
永远1 byte
?
我试图制作,std::basic_istream<std::byte>
但它缺少std::char_traits<std::byte>
等等.有人做过这种事吗?
我正在尝试将二进制格式的文件读入 std::vector<std::byte>
std::ifstream fStream(fName, std::ios::binary);
std::vector<std::byte> file_content((std::istreambuf_iterator<std::byte>(fStream)),
std::istreambuf_iterator<std::byte>());
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误(对我来说看起来像是istreambuf_iterator
缺少重载std::byte
)
error: no matching function for call to ‘std::istreambuf_iterator<std::byte>::istreambuf_iterator(std::ifstream&)’
std::vector<std::byte> file_content((std::istreambuf_iterator<std::byte>(fStream)),
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么 ?如果是的话,最好的方法是什么?
谢谢!
C++ 有很多类型模糊地描述相同的事物。假设我们正在针对一个字节为 8 位的架构进行编译,则以下所有类型都大致相似:
std::byte
std::uint8_t
std::bitset<8>
unsigned char
(8 位)char
(8 位)如果一个字节是 8 位,那么所有这些类型或多或少可以互换吗?如果没有,什么时候需要使用一个而不是另一个?
我经常在 Stack Overflow 上看到诸如将十六进制字符串转换为字节数组之类的问题,其中有人使用std::uint8_t
、char
和unsigned char
其他类型来表示“字节”。这只是风格偏好的问题吗?
注意:此问答旨在成为社区常见问题解答,鼓励进行编辑。std::byte
尽管 C++17 已经引入了这似乎使得选择变得显而易见,但何时使用“字节”的类型以及为什么的问题始终出现。std::bitset
提供一个常见问题解答来解决有关、std::uint8_t
等作为“字节”的所有误解是很有用的。鼓励编辑。