如何重载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
相关产品推荐
相关产品推荐

