2

json 入力の解析から取得したツリーを超える再帰関数の実装に問題があります。

json 入力。例えば:

{
  "attr" : { "a": 1, "ovec": [ { "b": 2, "c": 3 }, { "d": 4} ] }
}

これは「属性の複合値」と呼ばれるもので、値は単なる JSON ドキュメントです。その内容は完全に任意です (有効な JSON である限り)。

問題は、Vector の場合、Value::ConstValueIterator 型を使用してループする必要があることです (Value::ConstMemberIterator を使用する Object とは異なります)。

私の再帰関数にはパラメーターとして Value::ConstMemberIterator があり、Vector 内の Vector/Object に遭遇するまではすべて問題ありません。再帰呼び出しには、Value::ConstMemberIterator 型のイテレーターが必要です。

「トラバース」機能の関連部分:

int parseContextAttributeCompoundValue
(
    const Value::ConstMemberIterator&  node
)
{
    std::string type = jsonParseTypeNames[node->value.GetType()];
    if (type == "Array")
    {
        for (Value::ConstValueIterator iter = node->value.Begin(); iter != node->value.End(); ++iter)
        {
            std::string nodeType = jsonParseTypeNames[iter->value.GetType()];
            if (nodeType == "String")
            {
                val = iter->GetString();
            }
            // else if ...
            if ((nodeType == "Object") || (nodeType == "Array"))
            {
                // Here's my problem - need to convert 'iter' to Value::ConstMemberIterator
                // in order to recursively call parseContextAttributeCompoundValue for this object/array
                parseContextAttributeCompoundValue(iter); // COMPILATION ERROR
            }
        }
    }
    else if (type == "Object")
    {
        for (Value::ConstMemberIterator iter = node->value.MemberBegin(); iter != node->value.MemberEnd(); ++iter)
        {
            std::string nodeType = jsonParseTypeNames[iter->value.GetType()];
            if (nodeType == "String")
            {
                val = iter->value.GetString();
            }
            else if (nodeType == "Number")
            {

            if ((nodeType == "Object") || (nodeType == "Array"))
            {
                // Here I'm just fine as iter is of the desired type already
                parseContextAttributeCompoundValue(iter);
            }
        }
    }
}

iter->value.MemberBegin() を呼び出して目的の型に「変換」するなど、いくつか試しましたが、これまでのところ成功していません

ここで助けてくれてありがとう...

4

1 に答える 1

1

Valueイテレータを渡す代わりに、単純に型を指定して関数を呼び出すことができます:

void parseContextAttributeCompoundValue(const Value& v) {
    if (v.IsObject()) {
        // ...
    }
    else if (v.IsArray() {
        // ...
    }
}

そして、呼び出し元のサイトから:

for (Value::ConstValueIterator iter = ...) {
    parseContextAttributeCompoundValue(*iter);
}

for (Value::ConstMemberIterator iter = ...) {
    parseContextAttributeCompoundValue(iter->value);
}
于 2015-08-05T01:56:02.927 に答える