能否用constexpr函数在编译时为数组计算指定校验和?
带自动计算校验和的常量数组实现方案是否为良好实践?
需求背景
我有如下数组:
std::array<char, 10> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
需要为其追加2字节校验和,校验和的计算逻辑如下:
char x = 0; char y = 0; for (int i = 0; i < size; i++) { x = x + array[i]; y = x + y; }
最终要把计算得到的x、y值放到数组末尾。同时我希望这个数组作为类成员方法内的static变量,结构如下:
class Foo { public: char * getData(void) { static std::array<char, 10> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 需要在这里计算校验和 return &numbers[0]; } }
现有实现思路
方案1:预留空间并使用constexpr函数
我考虑预留2字节空间,通过引用传入constexpr函数来计算校验和,示例函数如下(注:原代码中array[i]应为arr[i],已修正):
constexpr void checksum_calc(std::array<char, 12>& arr) { char x = 0; char y = 0; for (int i = 0; i < 12 - 2; i++) { x = x + arr[i]; y = x + y; } arr[10] = x; arr[11] = y; }
方案2:模板化函数适配不同数组大小
为了适配不同长度的数组,我尝试将函数模板化,示例如下(注:原代码中array[i]应为arr[i],已修正):
template <size_t sz> constexpr void checksum_calc(std::array<char, sz>& arr) { char x = 0; char y = 0; for (int i = 0; i < sz - 2; i++) { x = x + arr[i]; y = x + y; } arr[sz - 2] = x; arr[sz - 1] = y; }
使用示例:
char * getData() { // 预留2字节用于存储校验和 static std::array<char, 12> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; checksum_calc<12>(numbers); return &numbers[0]; }
模板化后可以适配不同大小的数组,比如:
char * foo_getData() { // 预留2字节校验和空间 static std::array<char, 7> numbers = {1, 2, 3, 4, 5}; checksum_calc<7>(numbers); return &numbers[0]; } char * bar_getData() { // 预留2字节校验和空间 static std::array<char, 9> numbers = {1, 2, 3, 4, 5, 6, 7}; checksum_calc<9>(numbers); return &numbers[0]; }
核心疑问
我的核心需求是得到自动计算2字节校验和的常量数组,完全不想手动计算并添加校验值,请问上面的实现方案是否属于良好实践?
内容的提问来源于stack exchange,提问作者MrBit
相关产品推荐
相关产品推荐

