【发布时间】: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类型的想法,认为也许我可以输入 stlvector和map模板参数来提升any类型并获得类似多态的行为,但我是添加这么大的库只是为了解决这样的问题有点不舒服。 -
@qrikko 实际上,大多数 Boost 组件都是仅包含标头的,因此通常只需要包含正确的标头即可;在这种情况下,任何和变体都不需要链接;此外,您只能安装 Boost 的一部分,而不是所有内容
-
请参阅this question,如果您还没有。您将判断哪个最适合您的需求,或者如果您愿意,可以作为您自己实施的灵感。
标签: c++ objective-c json polymorphism code-design