Я использую libjson для анализа файла JSON в C ++. Мне было интересно, если вы могли бы сделать что-то вроде записи в стиле PHP для карты:
Просто псевдокод:
mapObj["id"] = 4;
mapObj["tags"] = vector {"Foo", "Bar"};
structMapObj = {
{"name", "FooBar"},
{"size", 1234567},
{"date", "2014-12-24"}
};
mapObj["file"] = anotherMapObject;// for the vector
mapObj["tags"][0];
mapObj["tags"][1];
mapObj["tags"].size();
mapObj["tags"].pushBack("Foo");
// for the map
mapObj["file"]["name"]
...
Можно ли получить такой результат?
Может быть, enum для текущего типа в BaseClass?
myObj["key"].getType; // returns a 1 for example an INT
Я пытался сделать это с помощью BaseClass и класса шаблона, но я не смог перебрать объект. Или я должен даже перегружать операторы для моего BaseClass? Или необходимо наследовать BaseClass для каждого случая (класс для объекта типа карты, класс для типа int, для строки и т. Д.)?
Я немного отчаялся прямо сейчас. Просто нужен кто-то, кто ведет меня в правильном направлении 😛
PS: я не хочу использовать boost: — /
Большое спасибо,
Даниил
Я ценю, что вы не хотите использовать повышение. Однако эта проблема в бусте была решена.
Вы по существу хотите карту строк к вариантам.
Взгляните на исходный код для boost :: option и boost :: any. Обратите особое внимание на то, как boost решает проблему рекурсивных определений, например, когда вы хотите сохранить карту внутри элемента другой карты.
Это научит вас больше, чем вы когда-либо хотели знать на эту тему 🙂
Существует проект с открытым исходным кодом для программиста C ++ Builder, который называется библиотека JSonCBB. Эта библиотека обеспечивает семантическое подобие вашей потребности: http://www.cbuilderblog.com/jsoncbuilderblog-class-library/