You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:39:00