2012-02-22 3 views
0

Я пытаюсь использовать контейнеры CoreFoundataion. Кажется, что это действительно удобный способ доступа к списку свойств. Тем не менее, я замечаю, что очень трудно получить доступ к внутренним контейнерам, если контейнер вложен (например, CFArrayRef содержит 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 является API C, поэтому нет оператора [] для перегрузки. Вы в основном есть 3 варианта:

  1. записи C на несколько строк, чтобы решить вопрос читаемость
  2. записи C++ обертками, если вы действительно хотите использовать C++
  3. использовать Objective-C, если у вас уже есть некоторые, все типы вы упоминающие здесь «бесплатный»

Я бы сказал, что палка с 1.

+0

спасибо за ответ. Я активно ее искал и в итоге получаю ответы. Я попробовал 2, сначала мне показалось легким, но потом я подумал, что мне нужно написать разные классы-словари и объекты-прокси, чтобы полностью модернизировать C++. Я в конечном итоге просто живу с любым стилем C (вариант 1). –

Смежные вопросы