如何使用类似`std::basic_istream<std::byte>`

2022-01-04 00:00:00 io c++ c++17 std

这个问题旨在将 std::byte 与标准输入输出一起使用.

是否有计划将read(_bytes)write(_bytes) 的适当函数重载添加到basic_istream 的接口中> 和 basic_ostream 在未来的标准中?什么理由反对它?我知道应该保留 CharT* 重载.如何使用 std::byte?我目前在我的项目功能中定义

std::istream&读取(std::istream&,std::byte*,std::streamsize)std::ostream&写(std::ostream&,const std::byte*,std::streamsize)

这些使用 reinterpret_cast<>char* resp.const char* 但我相信这取决于 char 的大小.我错了吗?char 总是 1 字节 吗?

我试图制作 std::basic_istream 但它缺少 std::char_traits 等等.有没有人已经做过这种事情?

解决方案

不要.

无论您是在文本模式"还是二进制模式"下操作,您所做的基本上都是对字符进行操作.

std::byte 不是为了这个目的,这就是它没有这些功能的原因.确实,它是故意引入而不是来拥有它们的!

<块引用>

enum class byte : unsigned char {} ; (C++17 起)

std::byte 是一种独特的类型,它实现了 C++ 语言定义中指定的字节概念.

charunsigned char 一样,它可以用来访问被其他对象占用的原始内存(对象表示),但与那些类型不同的是,它不是字符类型,也不是算术类型.一个字节只是位的集合,只为它定义了按位逻辑运算符.

http://en.cppreference.com/w/cpp/types/byte

<小时><块引用>

有人已经让这种事情奏效了吗?

不,正如上文所述,每个人都故意不这样做.

使用 charunsigned char,就像我们几十年来所做的那样!

This question aims for using std::byte with standard input-output.

Are there any plans to add proper function overloads for read(_bytes) and write(_bytes) to the interfaces of basic_istream<CharT> and basic_ostream<CharT> in a future standard? What reasons speak against it? I understand that the CharT*-overloads should be kept. What can I do to use std::byte? I currently define in my project functions

std::istream& read(std::istream&, std::byte*, std::streamsize)
std::ostream& write(std::ostream&, const std::byte*, std::streamsize)

These use reinterpret_cast<> to char* resp. const char* but I believe this depends on the size of char. Am I wrong? Is char always 1 byte?

I tried to make std::basic_istream<std::byte> but it is missing std::char_traits<std::byte> and so on. Did anyone make this kind of thing work already?

解决方案

Don't.

Whether you're operating in "text mode" or "binary mode", what you are still doing fundamentally is acting on characters.

std::byte is not for this purpose, and that's why it does not have these features. Indeed, it was deliberately introduced not to have them!

enum class byte : unsigned char {} ; (since C++17)

std::byte is a distinct type that implements the concept of byte as specified in the C++ language definition.

Like char and unsigned char, it can be used to access raw memory occupied by other objects (object representation), but unlike those types, it is not a character type and is not an arithmetic type. A byte is only a collection of bits, and only bitwise logic operators are defined for it.

http://en.cppreference.com/w/cpp/types/byte


Did anyone make this kind of thing work already?

No, everyone deliberately didn't, as explored above.

Use char or unsigned char, as we have done for decades!

相关文章