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

如何优雅地用一行代码根据参数包数量生成fmt格式字符串?

一行代码生成对应参数数量的fmt格式串

核心实现

利用C++17引入的折叠表达式,可以一行完成格式串的生成,替代原来的循环写法:

template <typename... Args>
void formatArgs(Args&&... args)
{
    const auto size = sizeof...(Args);
    std::string formatStr = (std::string("{}#") + ...); // 一行生成对应数量的"{}#"
    
    // 可选:去掉末尾多余的#(如果不需要最后一个参数后带#)
    if (size > 0)
        formatStr.pop_back();
    
    auto res = fmt::format(formatStr.c_str(), std::forward<Args>(args)...);
    // 后续处理res
}

原理说明

  • 折叠表达式(std::string("{}#") + ...)会把参数包Args展开为多次字符串相加操作:每一个参数对应一次"{}#"的拼接,最终生成"{}#{}#{}#..."格式的字符串,长度完全匹配参数数量。
  • 相比ostringstream循环的写法,这种方式更简洁,不需要额外的流对象,且编译器能更好地优化(参数数量为编译期常量时,甚至可以直接在编译期生成格式串)。
  • 注意参数包为空的情况:此时formatStr会是空字符串,调用fmt::format时需确保逻辑合法。

内容的提问来源于stack exchange,提问作者Hardwired

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:27:28