如何优雅地用一行代码根据参数包数量生成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
相关产品推荐
相关产品推荐

