提问人:Andi Abrudan 提问时间:11/18/2022 最后编辑:Jan SchultkeAndi Abrudan 更新时间:8/29/2023 访问量:508
如何在C++中定义std::byte的静态数组?[复制]
How to define a static array of std::byte in C++? [duplicate]
问:
我有一长串字节(例如,它们不代表 chars 或 int)。
目前,我只能做以下事情:
static const char myArray[] = {0xb8, 0xfe, 0x6c, 0x39, 0x23, ...}
我想要的是替换为 ,但编译器抱怨char
std::byte
“int”类型的值不能用于初始化“const std::byte”类型的实体
我看到了一些建议,但我发现其中任何一个都不合适:
- 将每个字节包装在调用中。
虽然这当然是最简单的修复方法,但我希望我们能体会到这看起来是多么荒谬。std::byte()
static const std::byte* myByteArray= reinterpret_cast<const std::byte*>(myArray);
这是*一个*解决方案,但我失去了查询大小 () 的能力,我必须处理一个额外的变量。sizeof myByteArray
- 使用可变参数模板函数,如本答案
中所述 此解决方案更改了我正在使用的数据类型。也许我只是经验不足,但我不相信定义静态数组。std::array
- 用户定义的文本。
与第(1)点相似,但更短。我可以重载并将其应用于每个元素。这仍然让我希望有一个解决方案,我不必触摸列表中的每个项目。_b
我也在考虑一个可以将字节构造函数应用于每个项目的可变宏,但宏不能是递归的,而且我一开始就对它们了解不够。
我遗漏了什么吗?让我知道是否有好的解决方案。
答:
0赞
Bernd
11/18/2022
#1
您可以创建一个用户定义的文字运算符,例如(代码链接):
#include <cstddef>
#include <iostream>
#include <array>
constexpr std::byte operator""_b(unsigned long long int i){
return static_cast<std::byte>(i);
}
static const std::array arr_cpp { 0xb8_b, 0xfe_b, 0x6c_b, 0x39_b, 0x23_b };
static const std::byte arr_c[] { 0xb8_b, 0xfe_b, 0x6c_b, 0x39_b, 0x23_b };
int main(){
for(auto a : arr_cpp){
std::cout << static_cast<int>(a) << "\n";
}
std::cout << "-----------\n";
for(auto a : arr_c){
std::cout << static_cast<int>(a) << "\n";
}
return 0;
}
使用纯 c 数组或包装的 c++ 数组并不重要 - 在 c++ 中,没有从 int 到 std::byte 或 char 的常量转换。
评论
0赞
Neil Butterworth
11/18/2022
你说的“不断转换”是什么意思?
0赞
Bernd
11/18/2022
0xb8 是类型的文字 - int 不能隐式转换为 char/byte,即使常量值适合目标范围。例如,在 csharp 中,由于隐式常量转换,您可以创建这样一个带有整数文本的字节数组(请参阅:learn.microsoft.com/en-us/dotnet/csharp/language-reference/...)。int
评论
uint8_t
byte
uint8_t
std::array
std::byte
在纸上看起来不错,但由于这样的原因,我从未真正使用过它。