如何向函数传递不同类型的rapidjson::GenericObject对象?
解决方法
方法一:模板函数(适配读写场景)
如果你的函数需要对GenericObject进行读写操作,可以定义模板函数,用模板参数接收GenericObject的第一个布尔模板参数(标识是否为const类型):
#include "rapidjson/document.h" template <bool Constness> MyObject readObject(rapidjson::GenericObject<Constness, rapidjson::Value>& obj) { MyObject result; // 示例:读取字符串成员 if (obj.HasMember("name") && obj["name"].IsString()) { result.name = obj["name"].GetString(); } // 示例:仅在非const场景下修改对象 if (!Constness && obj.HasMember("counter")) { obj["counter"].SetInt(obj["counter"].GetInt() + 1); } return result; }
编译器会自动为GenericObject<true, rapidjson::Value>和GenericObject<false, rapidjson::Value>生成对应的函数实例,完美适配两种输入类型。
方法二:const引用参数(仅读取场景)
如果你的函数只需要读取成员,不需要修改对象,可以直接将参数声明为const rapidjson::GenericObject<true, rapidjson::Value>&。因为非const的GenericObject<false, rapidjson::Value>可以隐式转换为const版本的引用,这样就能同时接收两种类型:
MyObject readObject(const rapidjson::GenericObject<true, rapidjson::Value>& obj) { MyObject result; // 示例:读取整数成员 if (obj.HasMember("id") && obj["id"].IsInt()) { result.id = obj["id"].GetInt(); } return result; }
这种写法更简洁,且能避免意外修改对象,适合只读场景。
补充说明
rapidjson::GenericObject<true, Value>是const对象视图,仅支持读取操作;GenericObject<false, Value>是可变对象视图,支持读写操作。- 优先推荐方法二(只读场景),代码更简洁安全;需要修改对象时再使用方法一的模板方案。
内容的提问来源于stack exchange,提问作者Markstar
相关产品推荐
相关产品推荐

