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

如何向函数传递不同类型的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:17:12