2

我正在查看可能集成的rapidjson代码。我可以看到,由于新的 C++11,您实际上可以在 C++ 中执行关联数组,尽管我不确定速度优势。但是,在他们的示例代码中,我看到了这一点:

 Document document; // Default template parameter uses UTF8 and MemoryPoolAllocator.

    char buffer[sizeof(json)];
    memcpy(buffer, json, sizeof(json));
    if (document.ParseInsitu(buffer).HasParseError())
        return 1;

    printf("\nAccess values in document:\n");
    assert(document.IsObject());    // Document is a JSON value represents the root of DOM. Root can be either an object or array.

    assert(document.HasMember("hello"));
    assert(document["hello"].IsString());
    printf("hello = %s\n", document["hello"].GetString());

看起来 Document 是一个具有被调用方法的类,但同时他能够使用document["hello"]作为关联数组来访问它?这就是这里发生的事情吗?

4

2 回答 2

3

在 C++ 中,operator[]可以被类重载。Document必须要么已经实现了重载,要么从已经实现的重载派生。

语法大致是:

class Foo {
public:
    AssociatedType operator [] (IndexingType i) {
        //...
    }
};

AssociatedType可以作为参考。方法可能是const

于 2015-09-09T16:43:30.143 回答
0

运算符重载从 C++ 早期就可用。

operator[]在 RapidJSON 中,定义了几个重载GenericValue,例如:

template<typename Encoding, typename Allocator>
template<typename T >
GenericValue& rapidjson::GenericValue< Encoding, Allocator >::operator[](T* name)   

并且GenericDocument源自GenericValue

于 2015-09-24T03:36:40.257 回答