C++如何实现简单的字符串格式化类_C++模仿Python中format语法【工具】-C++

不使用std::format或fmt::format因其兼容性差或过于重量级,需一个仅依赖标准库、支持位置/命名占位符的轻量实现,核心是两次遍历与状态机解析。

为什么不用 std::format 或 fmt::format

因为 C++20 的 std::format 在 MSVC 19.3x 之前不完整,GCC 13 以下默认不启用,Clang 更晚;而第三方 fmt::format 虽好,但引入整个库对轻量工具类来说太重。你需要的是一个仅依赖标准库、头文件即用、支持位置占位符(如 {0}、{1})和命名占位符(如 {name})的最小实现。

核心思路:两次遍历 + 状态机解析

不能靠正则(标准库无原生支持),也不宜递归展开。实际做法是:第一次扫描字符串,提取所有 {...} 片段,记录起始位置、类型(位置型/命名型)、参数索引或键名;第二次按顺序拼接——遇到普通文本直接追加,遇到占位符则查参数表并格式化(调用 std::to_string 或 std::ostringstream)。关键点:

  • { 必须成对出现,连续两个 {{ 视为字面量 {
  • 位置参数如 {0} 中的 0 必须是非负整数,超出传入参数数量则抛 std::out_of_range
  • 命名参数如 {user} 需要传入 std::map 或类似结构,未找到键时行为应明确(建议抛异常而非静默忽略)
  • 不支持对齐、精度等格式说明符(如 {:6}),那是 fmt 层级的事

简易实现示例(仅支持位置参数)

class SimpleFormatter {
public:
    template 
    static std::string format(const std::string& fmt, Args&&... args) {
        std::vector args_vec = {std::to_string(std::forward(args))...};
        std::string result;
        size_t i = 0;
        while (i < fmt.size()) {
            if (fmt[i] == '{' && i + 1 < fmt.size() && fmt[i + 1] == '{') {
                result += '{';
                i += 2;
            } else if (fmt[i] == '}' && i + 1 = args_vec.size()) throw std::out_of_range("index out of range");
                    result += args_vec[idx];
                } catch (const std::exception&) {
                    throw std::runtime_error("invalid placeholder: {" + content + "}");
                }
                i = end + 1;
            } else {
                result += fmt[i++];
            }
        }
        return result;
    }
};

用法:SimpleFormatter::format("Hello {0}, you have {1} messages", "Alice", 5) → "Hello Alice, you have 5 messages"。注意它不处理 int 以外类型(如 double 或自定义类),若需通用,得配合 std::ostringstream 替代 std::to_string。

命名参数支持的关键改动点

要支持 {name},必须把参数从变参包转为键值映射。最简方式是要求用户显式传入 std::unordered_map,并在解析到 {xxx} 且内容非数字时查表。但要注意:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何实现简单的字符串格式化类_C++模仿Python中format语法【工具】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995307+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995307+
  • 本周更新: 0+
  • 最后更新: 2026-03-16