【问题标题】:From Objective C to C++ typing headache从 Objective C 到 C++ 打字头痛
【发布时间】:2012-12-28 12:41:21
【问题描述】:

我曾在 C++ 中工作过,但那是几年前的事了,过去 5 年左右我几乎只在 Objective C 中工作过,也许我只是习惯了这样做。

但是我正在编写一个 C++ json-parser,它在概念上很困难,因为没有像 Objective C 中那样的自然映射。我并不是说它更好,只是说我还没有找到自然映射。

因此,在 Objective C 中,我通常会开始将 json 解析为 NSDictionary,因为它映射得非常好。 NSDictionary 是键值对数据类型,其中键通常是字符串(但可以是任何类型),值通常是 NSObject(从概念上讲),并且在 Objc 中,所有内容都继承 NSObject,因此类型是一种“自动多态” “如果你愿意的话。 (为任何可能确切知道如何帮助我但如果我不解释 Objc 却不明白我要求什么的 C++ 开发人员提供的解释)。

无论如何,这意味着如果我有一个示例 json-string:

{"key":1, "key2":3.14, "key3":"hello world", "key4":[1,2,3]}

它已经精确映射到一个 NSDictionary,其中第一个值是整数(或数字),第二个是浮点数(或数字),第三个是 NSString,第四个是一个 NSArray,其中包含三个值,这些值恰好是我的整数示例,但可以是任何东西,只要它是从 NSObject 派生的。

在 C++ 中,这对我来说更难理解并找到一个好的映射或模型,我想我可以滚动我自己的多态类型来做同样的事情,然后我可以有一个抽象类型的映射并变得漂亮几乎相同的行为。

但要么我认为我需要编写自己的容器(地图和矢量),要么编写自己的“Json 类型”。但是我有点害怕陷入 Objc 中正确的思维方式,因为它是一种非常不同的语言,并且建立在与 C++ 完全不同的设计理念之上。

也许有更好、更正确的方法在 C++ 中做这样的事情,我只是不知道。所以我的问题是如何在 C++ 中以一种好的方式处理可能具有不同类型的事物。

【问题讨论】:

  • 也许 Boost.Variant 或 Boost.Any 有帮助?
  • 啊哈……那是我大约一年前所做的。我有一个具有 java 类结构的 XML,我解析它并创建了 Objective-C 类。这需要 2 天的时间来编写,但只需点击几下,就可以转换 100 多个模型类。
  • @piwi 不会增加很多依赖项吗?我确实看过它,主要是针对 any 类型的想法,认为也许我可以输入 stl vector 和 map 模板参数来提升 any 类型并获得类似多态的行为,但我是添加这么大的库只是为了解决这样的问题有点不舒服。
  • @qrikko 实际上,大多数 Boost 组件都是仅包含标头的,因此通常只需要包含正确的标头即可;在这种情况下,任何和变体都不需要链接;此外,您只能安装 Boost 的一部分,而不是所有内容
  • 请参阅this question,如果您还没有。您将判断哪个最适合您的需求,或者如果您愿意,可以作为您自己实施的灵感。

标签: c++ objective-c json polymorphism code-design


【解决方案1】:

首先声明一下,当我在这里谈论 Objective C 时,我确实包含了很多 Cocoa,我认为大多数读者会无缝地将其读入其中,但是当我谈论 Cocoa 特定的东西时,我将其称为 Objective C 只是我真的习惯使用 Cocoa 和 Objective C(即 OSX 开发)。

好吧,我有一些意见,我可能会在这里采用的解决方案是熟悉Boost。所以这意味着我将我的json dictionaries 解析为std::map <std::string, boost::any> 并将我的数组/向量解析为std::vector <boost::any>,这会将硬输入放松到更适合json 等数据描述格式的级别。

感谢所有在这里评论和帮助的人!

很棒的是,即使这是针对我的 json-parser 的,它也确实给了我更多的视角,所以我觉得我也遇到过类似的问题,因为我在使用弱类型语言编码时被宠坏了,并且有一个更开放(或者我猜取决于你如何看待它)的对象架构。希望其他人也会发现这个问题也很有用!

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2020-06-28
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多