我使用jsoncpp来操作JSON字符串。将字符串解析为我想要访问的Json :: Value并且可能更改其中一个嵌套对象(如果存在)。如果嵌套对象不存在,我不希望它被创建。
查看json documentation似乎返回对象引用的唯一方法是通过operator []。
Value& operator[] (const char *key)
按名称访问对象值,如果不存在,则创建一个null成员。
const Value& operator[] (const char *key) const
按名称访问对象值,如果没有具有该名称的成员,则返回null。
我需要结合这两者的语义的东西:我想要一个可变的引用,但如果它不存在则不会涉及创建一个对象。 (我理解为什么Json :: Value接口的设计方式如下:返回一个可变引用会暴露其内部空对象。)
我能看到的唯一干净的方法是使用Json :: Value :: isMember来确定对象是否存在,然后使用Value& operator []访问该对象。但这涉及两个O(log N)查找而不是一个,我可能想要避免。
如果没有一个丑陋的const_cast,有什么明智的方法可以做我想要的吗?
答案 0 :(得分:1)
Wintermute是正确的。
考虑一下你的用例。希望它适合以下其中一个:
operator[]()
或get()
,然后使用removeMember()
。但是如果您提出的功能对您非常重要,我们可以添加一个新方法:
bool Value::get(char const* key, Value** gotten);
这会导致您自己的Value*
指向成员,但前提是它存在。 (我想我们甚至可以删除bool
并在找不到时设置*gotten = nullptr
。)如果您感兴趣,file an issue。