如何在C++中定义std::byte类型的静态数组?
问题:将char数组转为std::byte数组的简洁方案
我有一串很长的字节序列(这些字节并不代表字符或整数),目前用以下方式定义数组:
static const char myArray[] = {0xb8, 0xfe, 0x6c, 0x39, 0x23, ...};
我希望把char替换为std::byte,但编译器报错:
a value of type "int" cannot be used to initialize an entity of type "const std::byte"
我试过几种方案,但都不太满意:
- 为每个字节包裹
std::byte()调用:能解决问题,但写起来太繁琐,尤其是数组很长的时候。 - 使用
static const std::byte* myByteArray= reinterpret_cast<const std::byte*>(myArray);:可以用,但没法通过sizeof myByteArray获取数组大小,还要额外维护一个变量。 - 使用可变参数模板函数生成
std::array:改变了原本的数组类型,而且我不太想用std::array来定义静态数组。 - 用户自定义字面量
_b:比第一种写法短,但还是要修改每个元素,不够省心。
我还考虑过用可变参数宏自动给每个元素加字节构造函数,但宏没法递归,我对宏也不太熟。
有没有遗漏的方案?求一个合适的简洁解决方案。
推荐解决方案
方案1:C++20 原生std::to_array(最简洁)
如果你的项目可以升级到C++20,这是最优解——不用修改原数组的任何元素,一行代码完成转换,同时保留数组的大小信息:
#include <array> #include <cstddef> // 原char数组保持不变 static const char myArray[] = {0xb8, 0xfe, 0x6c, 0x39, 0x23, ...}; // 转换为std::byte数组(std::array类型,内存布局和普通数组完全一致) static constexpr auto myByteArray = std::to_array<std::byte>(myArray);
std::array<std::byte, N>可以像普通数组一样通过[]访问,也可以用myByteArray.size()获取长度,sizeof(myByteArray)也能得到整个数组的内存大小,完全满足静态数组的使用需求。
方案2:C++17 编译期模板转换(兼容旧标准)
如果只能用C++17或更早版本,可以自己写一个编译期模板函数来完成转换,同样不需要修改原数组元素:
#include <array> #include <cstddef> template <std::size_t N> constexpr std::array<std::byte, N> char_to_byte_array(const char (&arr)[N]) { std::array<std::byte, N> result{}; for (std::size_t i = 0; i < N; ++i) { result[i] = static_cast<std::byte>(arr[i]); } return result; } // 使用方式 static const char myArray[] = {0xb8, 0xfe, 0x6c, 0x39, 0x23, ...}; static constexpr auto myByteArray = char_to_byte_array(myArray);
这个方案的效果和std::to_array一致,只是手动实现了转换逻辑,编译期就能完成计算,不会有运行时开销。
方案3:宏批量转换(无需升级C++标准)
如果不想用std::array,也可以用宏来批量给每个元素添加std::byte()构造,避免手动修改每个元素:
// 定义宏:将单个值转为std::byte #define TO_BYTE(x) std::byte(x) // 定义数组宏:自动处理所有元素 #define BYTE_ARRAY(...) { TO_BYTE(__VA_ARGS__), } // 使用时直接把原数组的元素放进宏里 static const std::byte myArray[] = BYTE_ARRAY(0xb8, 0xfe, 0x6c, 0x39, 0x23, ...);
C++允许数组初始化列表的末尾逗号,所以这个宏不会有语法问题。如果元素数量极多,也可以结合预处理器的批量展开工具来处理,但对于大多数场景,上面的简单宏足够用。
内容的提问来源于stack exchange,提问作者Andi Abrudan
相关产品推荐
相关产品推荐

