Я работал в C ++, но это было несколько лет назад, последние 5 или около того лет я почти только работал в Objective C, и, возможно, я просто успокоился.
Однако я пишу C ++ json-parser, и это концептуально сложно, так как нет естественного отображения, как в Objective C. Я не говорю, что так или иначе лучше, просто заявляя, что я не нашел естественного отображения ,
Так что в Objective C я обычно начинаю синтаксический анализ json как NSDictionary, так как он очень хорошо отображается. NSDictionary — это тип данных пары ключ-значение, где ключ, как правило, является строкой (но может быть любого типа), а значение, как правило, является NSObject (концептуально), а в Objc все наследует NSObject, поэтому типы являются своего рода «автополиморфными». » если вы будете. (объяснение дано для любого разработчика на C ++, который может точно знать, как мне помочь, но не понимает, о чем я прошу, если не объясню Objc).
В любом случае это означает, что если у меня есть пример json-string:
{"key":1, "key2":3.14, "key3":"hello world", "key4":[1,2,3]}
он уже отображается точно на NSDictionary, где первое значение будет целым числом (или числом), вторым с плавающей точкой (или числом), третьим по NSString, а 4-е будет NSArray, который содержит три значения, которые в моем примере являются целыми числами, но могут быть чем-либо вообще, если оно получено из NSObject.
В C ++ мне гораздо сложнее понять и найти хорошее отображение или модель, я думаю, я мог бы свернуть свои полиморфные типы, чтобы сделать то же самое, тогда я мог бы иметь карту с абстрактным типом и получить почти то же самое. поведение.
Но либо я думаю, что мне нужно написать свои собственные контейнеры (карту и векторы), либо написать свои собственные «Json-типы». Однако я немного боюсь застрять в мышлении, что правильно в Objc, так как это совершенно другой язык и построенный на совершенно других дизайнерских идеях, чем C ++.
Возможно, есть лучшие и более правильные способы делать подобные вещи в C ++, которых я просто не знаю. Поэтому мои вопросы — как правильно обрабатывать вещи, которые могут иметь разные типы в C ++.
Прежде всего, отказ от ответственности, когда я говорю об Objective C здесь, я действительно включаю много какао, я думаю, что большинство читателей будут легко читать это в него, но чтобы было ясно, когда я говорю о специфических вещах Какао, называющих это Objective C, это просто что я действительно привык использовать Какао вместе с Objective C (т.е. разработка OSX).
Ну, у меня есть некоторый вклад, и решение, с которым я, вероятно, собираюсь здесь, состоит в том, чтобы Boost
, Так что это будет означать, что я разбираю json dictionaries
как std::map <std::string, boost::any>
и мои массивы / векторы как std::vector <boost::any>
и это ослабит жесткую типизацию до уровня, более подходящего для формата описания данных, такого как json.
Спасибо всем, кто комментирует и помогает здесь!
Самое замечательное то, что даже если это для моего json-парсера, это действительно дало мне больше перспективы, поэтому я чувствую, что есть похожие проблемы, с которыми я столкнулся, будучи испорченным в кодировании на языках, которые менее типизированы и имеют более открытая (или закрытая, я думаю, в зависимости от того, как вы это видите) объектная архитектура. Надеюсь, что другие найдут этот вопрос полезным!
Других решений пока нет …