Этот код обращается к ассоциативному массиву в классе на С++?

Я просматриваю код rapidjson для возможной интеграции. Я вижу, что благодаря новому С++ 11 вы действительно можете создавать ассоциативные массивы в С++, хотя я не уверен в преимуществах скорости. Однако в их примере кода я вижу это:

 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"] как ассоциативный массив? Это то, что здесь происходит?


person Mikey A. Leonetti    schedule 09.09.2015    source источник
comment
Я не вижу здесь никакого противоречия. Это просто синтаксическая вещь. Если в языке коллекции являются объектами (как в C++), почему бы вам не использовать как синтаксис подписки, так и вызовы методов для их использования?   -  person The Paramagnetic Croissant    schedule 09.09.2015
comment
C++ имеет ассоциативные массивы в стандартной библиотеке (std::map и std::unordered_map), так что это не должно удивлять...   -  person rlbond    schedule 09.09.2015
comment
stackoverflow.com/questions/4294100/   -  person Johnny Mopp    schedule 09.09.2015


Ответы (2)


В C++ operator[] может быть перегружен классом. Document должен либо реализовать перегрузку, либо быть производным от нее.

Синтаксис примерно такой:

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

AssociatedType может быть ссылкой. Метод может быть const.

person jxh    schedule 09.09.2015

Перегрузка операторов доступна с первых дней C++.

В RapidJSON есть несколько перегруженных operator[], определенных в GenericValue, например:

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

И GenericDocument происходит от GenericValue.

person Milo Yip    schedule 24.09.2015