2012-02-22 47 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