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

如何重载operator<<实现自定义类嵌套map的递归制表打印?

如何重载operator<<实现自定义嵌套类的缩进格式化打印?

要实现带缩进的嵌套打印,核心是借助递归+缩进控制的辅助函数——因为直接重载operator<<没法传递缩进参数,得靠辅助函数处理嵌套层级的缩进逻辑。以下是完整的实现方案:

完整代码示例

#include <iostream>
#include <map>
#include <string>

class test {
private:
    std::map<std::string, std::string> sMap;
    std::map<std::string, test> testMap;

    // 辅助打印函数,带缩进参数,处理递归打印
    static void print(const test& obj, std::ostream& os, int indent) {
        // 生成当前层级的缩进字符串
        std::string indentStr(indent, '\t');

        // 打印string到string的map
        for (const auto& pair : obj.sMap) {
            os << indentStr << pair.first << ": " << pair.second << "\n";
        }

        // 递归打印嵌套的testMap
        for (const auto& pair : obj.testMap) {
            os << indentStr << pair.first << " {\n";
            print(pair.second, os, indent + 1);
            os << indentStr << "}\n";
        }
    }

public:
    // 对外提供的插入函数,方便填充数据
    void addString(const std::string& key, const std::string& val) {
        sMap[key] = val;
    }

    void addTest(const std::string& key, const test& val) {
        testMap[key] = val;
    }

    // 重载operator<<,调用辅助函数,初始缩进为0
    friend std::ostream& operator<<(std::ostream& os, const test& obj) {
        print(obj, os, 0);
        return os;
    }
};

int main() {
    // 构建测试数据
    test subTest;
    subTest.addString("sub_key1", "sub_val1");
    subTest.addString("sub_key2", "sub_val2");

    test rootTest;
    rootTest.addString("key1", "val1");
    rootTest.addString("key2", "val2");
    rootTest.addTest("nested_test", subTest);

    // 打印
    std::cout << rootTest << std::endl;
    return 0;
}

输出效果

运行后会得到如下带缩进的结构化输出:

key1: val1
key2: val2
nested_test {
        sub_key1: sub_val1
        sub_key2: sub_val2
}

关键逻辑说明

  • 辅助函数print:作为静态成员函数(也可以是友元全局函数),接收当前要打印的test对象、输出流和当前缩进值。先打印当前层级的sMap键值对,再遍历testMap,每遇到一个嵌套的test对象,就递归调用print并把缩进值+1,实现层级缩进。
  • 重载operator<<:作为友元函数,直接调用辅助print函数,传入初始缩进0,同时返回输出流对象,支持链式调用(比如cout << test1 << test2;)。
  • 缩进控制:用std::string(indent, '\t')生成对应层级的制表符缩进,你也可以换成空格(比如4个空格),调整缩进样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:05:19