C++构造map键时反转可变模板参数计算顺序的简洁方案问询
方案1:C++17 折叠表达式实现(最简洁)
直接利用C++17的折叠表达式按传入顺序处理参数,逻辑清晰无冗余:
#include <cstdint> template<typename... Args> uint64_t key(int base, Args... args) { uint64_t res = 0; // 按参数传入顺序依次计算,每步左移一位(乘base)加当前位 ((res = res * base + (static_cast<uint64_t>(args) % base)), ...); return res; }
调用key(10, 1, 2, 3)会直接返回期望的123。
方案2:兼容C11/C14 的实现
如果需要兼容旧标准,可以用初始化列表展开实现正序处理,同样不需要额外的辅助函数和引用传递:
#include <cstdint> template<typename... Args> uint64_t key(int base, Args... args) { uint64_t res = 0; // 利用初始化列表的顺序展开规则按传入顺序处理参数 int unused[] = {0, (res = res * base + (static_cast<uint64_t>(args) % base), 0)...}; (void)unused; // 消除未使用变量的编译警告 return res; }
原代码输出倒置的原因
最初的递归实现会先递归处理后续参数,再计算当前位,相当于从最后一个参数开始往第一位拼接,所以得到的是倒置的321。上面两种方案都是严格按参数传入的正序处理,每一步将已有结果乘base(相当于左移一位)再加上当前位的值,自然得到正序拼接的结果。
内容的提问来源于stack exchange,提问作者hochl
相关产品推荐
相关产品推荐

