我有这么长的字节列表(例如,它们不代表字符或整数)。
目前,我只能做以下事情:
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
定义静态数组。_b
并将其应用到每个元素。这仍然让我希望有一个解决方案,让我不必触摸列表中的每个项目。我也在考虑一个可变参数宏,它可以在每个项目上应用字节构造函数,但宏不能递归,而且我一开始对它们了解不够。
我有遗漏什么吗?让我知道是否有好的解决方案。
您可以创建用户定义的文字运算符,例如(代码链接):
#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 的常量转换。