От Objective C до C ++ набирает головную боль

Я работал на C ++, но это было несколько лет назад, последние 5 или около того лет, которые я почти только работал в Objective C, и, возможно, мне просто стало удобно это делать.

Однако я пишу json-parser на C ++, и это концептуально сложно, поскольку нет естественного отображения, как в 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, где первым значением будет целое число (или число), второе - float (или число), третье - NSString, а 4th - NSArray, которые содержат три значения, которые в моем примере являются целыми числами, но могут быть вообще чем угодно, если он получен из NSObject.

В C ++ для меня гораздо сложнее понять и найти хорошее сопоставление или модель, я думаю, я мог бы свернуть свои собственные полиморфные типы, чтобы сделать то же самое, тогда у меня может быть карта с абстрактным типом и получить почти то же самое поведение.

Но я думаю, что мне нужно будет написать свои собственные контейнеры (карты и векторы) или написать собственные «Json-типы». Однако я немного боюсь быть слишком застрявшим на пути мышления, которое справедливо в Objc, так как это совсем другой язык и построен на совершенно разных дизайнерских идеях, а затем на C ++.

Возможно, есть лучшие и правильные способы делать такие вещи на C ++, которые я просто не знаю. Поэтому мои вопросы - это то, как обрабатывать вещи, которые могут иметь разные типы в хорошем смысле на C ++.

3
nl ja de
Может быть, Boost.Variant или Boost.Any могут помочь?
добавлено автор piwi, источник
@qrikko На самом деле большинство компонентов Boost имеют только заголовок, поэтому он обычно не требует ничего, кроме включения правильных заголовков; в этом случае ни один, ни вариант не нуждаются в связывании; Кроме того, вы можете установить только части Boost, а не все
добавлено автор piwi, источник
@didierc на самом деле затрагивает многие мои проблемы/вопросы и делает его более ясным.
добавлено автор qrikko, источник
@Linuxios да, я думаю .. Мне очень трудно быть немного испорченным более свободно типизированным objc, где все действительно может быть применено к тому, что вам нужно, и полиморфизм скорее ожидаемый, а не принудительный (или то, что я должен назвать способ C ++ обрабатывает полиморфизм). Но много раз я чувствую, когда смотрю на проблему на C ++, что на другом языке, таком как ruby, Lua или Objc, я сразу вижу, как справиться с этим, на C ++ я чувствую, что всегда так мало «но» на пути , Я могу разобрать json, используя std :: map , но тогда мне нужно ограничить типы. Но Boost может преодолеть мое понимание.
добавлено автор qrikko, источник
@Linuxios Да, у этого есть некоторые действительно приятные преимущества, это немного утомительно, я думаю, и я совсем не привык думать так, но мог видеть, как я в него вникаю. Это позволяет очень хороший доступ и небольшой набор сумасшедших возможностей (т. Е. Не существует 2k способов сделать то же самое). Но опять же я не так привык думать так, даже если мне нравится это как идея и считаю, что я могу привыкнуть к этому ...: P
добавлено автор qrikko, источник
@Linuxios да, похоже, это способ сделать это. Я боялся, что Boost даст мне большую зависимость, но поскольку пиви указала, что это действительно не из-за того, как это реализовано. Поэтому я прочитаю некоторые документы Boost, но из моих ответов здесь выглядит так, как будто это путь, который сделает меня и C ++ счастливыми.
добавлено автор qrikko, источник
@Linuxios Я хочу использовать std :: vector и std :: map , но я некоторое время подвергался Objc и модели наследования, а < code> vector в json может иметь любой тип для объектов внутри него. Таким образом, это хорошо отображает objc NSArray может иметь любой объект, если он получен из NSObject , тогда как на C ++ мне нужно знать тип заранее (поскольку набирать намного сложнее в C ++). поэтому я могу сделать: std :: vector сохранить целые числа, но json-массив может иметь один int , затем string и скоро. Вот почему я пытаюсь найти способ, который работает как для меня, так и для C ++. (надеюсь, что это имело смысл)
добавлено автор qrikko, источник
@piwi - отличная информация, и это делает ее более привлекательной альтернативой. Я не хочу пропускать отличную функциональность только для того, чтобы быть человеком, не зависимым от потребностей, но я хочу знать, что я беру в проект и почему. Но я возьму другой, немного глубже, посмотрю в Boost, так как он, кажется, решает мои проблемы элегантным и довольно удобным способом.
добавлено автор qrikko, источник
@Linuxios Я всегда учился и насколько я могу поделиться своим опытом. :)
добавлено автор qrikko, источник
@AnoopVaidya ах! Я вижу, и, возможно, это действительно путь, я думал об этом, он держит мои зависимости чистыми, которые я ценю. Но, возможно, я сделаю именно это, реализую свои собственные типы данных, которые работают как NSDictionary, NSArray и т. Д., В основном добавляют некоторый синтаксический сахар в мой проект на C ++.
добавлено автор qrikko, источник
@Linuxios Я не знаю, как это сделать, поэтому, пожалуйста, продолжайте.
добавлено автор qrikko, источник
@AnoopVaidya Я не уверен, что полностью понимаю, что вы сделали? Вы реализовали полиморфные классы в java, чтобы получить поведение объектно-c NSDictionary ?
добавлено автор qrikko, источник
@piwi не стимулирует много зависимостей? Я посмотрел на него, главным образом, на тип any , который, возможно, мог бы иметь аргументы шаблона stl vector и map , введенные для увеличения any и получить полиморфные поведения, но мне немного неудобно добавлять такую ​​огромную библиотеку, чтобы решить что-то подобное.
добавлено автор qrikko, источник
@qrikko: если вы хотите создать чат, я его создам.
добавлено автор Linuxios, источник
@qrikko: Верно, правда. Я мог бы поговорить об этом несколько дней. Если вы захотите, мы можем создать чат-поток, где он не будет удален, поскольку он не имеет отношения к вопросу.
добавлено автор Linuxios, источник
@qrikko: Согласен. Я начал предпочитать C для философии «все есть кусочек бит». это позволяет вам делать гораздо больше.
добавлено автор Linuxios, источник
добавлено автор Linuxios, источник
@qrikko: Вы узнаете, что мало что делает C ++ счастливым или ужасно полезным. Это может быть ад.
добавлено автор Linuxios, источник
@qrikko: Поэтому используйте std :: vector boost :: any.
добавлено автор Linuxios, источник
@qrikko: Почему ваш собственный? Попробуйте std :: vector и std :: map .
добавлено автор Linuxios, источник
всегда пожалуйста!
добавлено автор didierc, источник
см. этот вопрос , если вы этого еще не сделали. Вы будете судьей, который лучше всего подходит для ваших нужд, или как вдохновение для вашей собственной реализации, если вы хотите это сделать.
добавлено автор didierc, источник
Или вы можете написать парсер в obj-c. Запишите вывод в файл. И прочитайте этот файл с C ++. Если может помочь вам немного? Но я не уверен.
добавлено автор Anoop Vaidya, источник
Нет. Я прочитал файл .java и создал .h и .m для obj-c. Здесь вам нужно создать файл/парсер C ++ из obj-c.
добавлено автор Anoop Vaidya, источник
Ага ... Это то, что я делал год назад. У меня был XML, имеющий структуру классов для java, я проанализировал его и создал классы Objective-C. Это заняло 2 дня, чтобы написать, но 100 классов модельных классов были преобразованы всего за несколько кликов.
добавлено автор Anoop Vaidya, источник

1 ответы

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

Well I've got some input and the solution I am probably going with here is to adept to Boost. So this would mean that I parse my json dictionaries as std::map and my arrays/vectors as std::vector and this will loosen up the hard typing to a level which is more fitting for a data description format such as json.

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

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

1
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest