От Цели C до C ++ печатающая головная боль

Я работал в 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 ++.

3

Решение

Прежде всего, отказ от ответственности, когда я говорю об Objective C здесь, я действительно включаю много какао, я думаю, что большинство читателей будут легко читать это в него, но чтобы было ясно, когда я говорю о специфических вещах Какао, называющих это Objective C, это просто что я действительно привык использовать Какао вместе с Objective C (т.е. разработка OSX).

Ну, у меня есть некоторый вклад, и решение, с которым я, вероятно, собираюсь здесь, состоит в том, чтобы Boost, Так что это будет означать, что я разбираю json dictionaries как std::map <std::string, boost::any> и мои массивы / векторы как std::vector <boost::any> и это ослабит жесткую типизацию до уровня, более подходящего для формата описания данных, такого как json.

Спасибо всем, кто комментирует и помогает здесь!

Самое замечательное то, что даже если это для моего json-парсера, это действительно дало мне больше перспективы, поэтому я чувствую, что есть похожие проблемы, с которыми я столкнулся, будучи испорченным в кодировании на языках, которые менее типизированы и имеют более открытая (или закрытая, я думаю, в зависимости от того, как вы это видите) объектная архитектура. Надеюсь, что другие найдут этот вопрос полезным!

1

Другие решения

Других решений пока нет …