变量作为文档索引

时间:2015-07-06 14:07:56

标签: c++ dom enums

我使用rapidjson库来解析json数据。

要读取我使用的元素,例如,此代码:

Document d;
d.Parse(json); //Parse JSON data
d["name"].Accept(writer)

将其发送到StringBuffer,它允许我以String形式读取数据。但是现在我正试图让这种阅读充满活力。现在我读了“名字”字段,但这可能有所不同。所以我想用变量做这个,我尝试了这个:

String s = "name";
d[s].Accept(writer)

但这会导致错误

  

表达式必须具有整数或未整合的枚举类型

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

当你调用d["name"] c ++运算符重载的原因时,我无法说出实际发生了什么,但" name"基本上是const char*而不是字符串。

所以我会假设

const char* s = "name";
d[s].Accept(writer);

会更好。

实际上在c ++中,标准运算符[]被定义为采用std :: size_t。字符串不能转换为std :: size_t,但任何指针(如const char*)都可以。这意味着"整数或无范围的枚举"。

但是对于地图类型,[]运算符可以采用非整数值,例如复杂对象等。但似乎你的operator []的行为与标准数组下标相似。

BTW:在rapidjson中(我刚检查了github源代码),GenericDocument是一个具有运算符的GenericValue

GenericValue& operator[](const std::basic_string<Ch>& name) { return (*this)[GenericValue(StringRef(name))]; }

因此,您可以使用std::string

答案 1 :(得分:-1)

当我们不知道变量的类型时,很难回答这个问题。我假设d正在解决包含某种MyClass类型具有Accept函数的对象的集合。

如果您需要此类行为,则必须使用类似std地图的内容。

它的用法如下:

// The key type is string and the value type is myClass
//  key     value
map<string, MyClass> myDict;

myDict["name"].Accept(writer);

现在你可以拥有一个与MyClass相关联的字符串。

顺便说一下,string以小写字母开头。编译器找不到String

编辑: 啊! d的类型是json文档!如果要操作这样的json文档,则必须使用外部库,例如jsoncpp

编辑: 似乎你已经使用了json库。