2012-02-22 49 views
0

我想使用CoreFoundataion容器。在访问属性列表时,它似乎是一个非常方便的方式。但是,我注意到,如果容器嵌套,访问内部容器非常尴尬(例如,CFArrayRef包含一个CFDictionaryRef,CFDictionaryRef然后具有一个其值为另一个CFArrayRef的键。也许下面的图表会更好一些)。高效和快速访问CoreFoundation容器

CFArrayRef a 

    |----CFDictionaryRef b (assume it's at index 2 of a) 

        |----CFArrayRef c (assume, they key value is "array") 

所以我们可以说我们得到了一个CFArrayRef一个 我想在CFIndex 0访问元素CFArrayRefÇ

我必须键入这样的事情:

CFArrayGetValueAtIndex((CFArrayRef)CFDictionaryGetValue((CFDictionaryRef)CFArrayGetValueAtIndex(a, 2), CFSTR("array")), 0) 

,看起来对我来说是很多打字。我的猜测是CoreFoundation基于C而不是C++,因此它不提供像“[]”那样的运算符重载来访问它的元素。

有没有一种方法,使这项访问更容易在打字(也许读呢?)

我使用C++,我正在考虑超载运算符“[]”某些CFTypeRef(如CFArrayRef, CFDictionaryRef,CFStringRef),不知道这是不是一个好主意。

回答

2

正如您所指出的,Core Foundation API是一个C API,因此没有[]运算符可以重载。你基本上有3种选择:多条线路上

  1. 写C到解决的可读性问题
  2. 写C++包装,如果你真的想用C++
  3. 使用的Objective-C,如果你已经有了一些,所有的你提的类型是“免费电话”

我会说坚持使用1

+0

感谢您的回答。我正在积极地寻找它,并且最终得到你的答案。我尝试了2,实际上它看起来很容易,但是后来我发现我需要编写不同的字典创建者类和代理对象,以使其完全用C++现代化。我最终只能生活在任何C风格(选项1)中。 – 2012-07-15 05:38:22