2012-02-22 2 views
0

J'essaie d'utiliser des conteneurs CoreFoundataion. Il semble être un moyen très pratique lors de l'accès à la liste des propriétés. Cependant, je remarque qu'il est vraiment difficile d'accéder à des conteneurs internes si le conteneur est imbriqué (par exemple, un CFArrayRef contient un CFDictionaryRef, qui a alors une clé dont la valeur est un autre CFArrayRef.Peut-être qu'un graphique ci-dessous montre un peu mieux).Efficace et rapide pour accéder aux conteneurs CoreFoundation

CFArrayRef a 

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

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

Alors disons que nous avons un CFArrayRef un et je veux accéder à l'élément à CFINDEX 0 dans CFArrayRef c

Je dois taper quelque chose comme ceci:

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

qui ressemble Pour moi, c'est beaucoup de dactylographie. Ma conjecture est que CoreFoundation est basé sur C plutôt que C++, donc il ne fournit pas de surcharge d'opérateur comme "[]" pour accéder à son élément.

Y at-il un moyen de rendre cet accès plus facile à taper (peut-être pour la lecture aussi bien?)

J'utilise C++, je considérais surcharge l'opérateur « [] » pour certains CFTypeRef (comme CFArrayRef, CFDictionaryRef, CFStringRef), je ne sais pas si c'est une bonne idée.

Répondre

2

Comme vous l'avez noté, l'API de la fondation de base est une API C, donc il n'y a pas d'opérateur [] à surcharger. Vous avez essentiellement 3 choix:

  1. écriture C sur plusieurs lignes pour résoudre le problème de lisibilité
  2. écrire wrappers C++ si vous voulez vraiment utiliser C++
  3. utilisation Objective-C si vous avez déjà quelques-uns, tous les types que vous mentionnez ici sont « sans frais »

Je dirais bâton avec 1.

+0

merci pour la réponse. Je le cherchais activement, et je finissais à peu près avec tes réponses. J'ai essayé 2, il a semblé facile en premier mais alors j'ai pensé que j'ai besoin d'écrire différents objets de classe et de proxy de créateur de dictionnaire pour le rendre complètement C++ modernisé. Je finis par vivre avec n'importe quel style C (option 1). –

Questions connexes