2009-08-25 10 views
0
typedef boost::shared_ptr<config_value_c> config_value_ptr; 

typedef std::vector<config_value_ptr> config_value_vec; 

config_value_vec config; 

typeof (config.iterator()) it = config.iterator(); 

Je souhaite extraire un itérateur à un tableau de pointeurs de sur-optimisation dans la classe config_value_c. Je sais que je peux spécifier l'itérateur comme std :: vector <config_value_ptr> :: itérateur mais je veux le faire de manière agnostique, donc si jamais je change le vecteur à une liste, je ne dois pas revenir en arrière et mettre à jour le code. Est-ce possible? Merci.Quelle est la bonne façon d'écrire ce code?

Je sais que typeof n'est pas un vrai mot-clé, et je connais le typeid mais il ne fait pas ce que je veux.

+2

Qu'est-ce qui ne va pas avec 'config_value_vec :: iterator'? – avakar

Répondre

8

Je pense que vous voulez:

config_value_vec::iterator it = config.begin(); 

La prochaine édition de la norme C (C++ 0x) vous permettra de le faire:

auto it = config.begin(); 
+0

J'écrivais juste ceci: P vous avez frappé le premier poste je suppose ... –

+0

Aw, désolé de voler votre tonnerre :-) –

1

Je pense que vous voulez ceci:

Éviter la construction de l'itérateur car il a un comportement indéfini.
config_value_vec::iterator it = config.begin(); 

Si vous allez écrire une méthode de modèle, assurez-vous de continuer avec le mot-clé typename.

template< typename Contener > 
void some_function(Contener const& contener) 
{ 
    typename Contener::iterator it = contener.begin(); 
    // do somethind with it 
} 
1

Vous pouvez faire l'une des quatre choses:

1) Utilisez le mot-clé à venir automatique, comme cela a déjà répondu.

2) Donnez au conteneur typedef un nom générique afin de pouvoir changer son type sans vouloir en réécrire les usages généraux.

typedef std::vector<config_value_ptr> config_value_container; 

config_value_container config; 
config_value_container::iterator it = config.begin(); 

3) Si vous voulez que le nom du conteneur typedef pour rester spécifique, alors vous pourriez faire un typedef iterator.

typedef std::vector<config_value_ptr> config_value_vec; 
typedef config_value_vec::iterator config_value_container_iterator; 

config_value_vec config; 
config_value_container_iterator it = config.begin(); 

Bien sûr, si vous commencez besoin de différents types d'itérateurs pour le conteneur (const vs non-const, arrière vs avant, etc) alors vous pouvez retrouver avec plusieurs typedefs iterator.

4) Ne vous en souciez pas, car les types de conteneur peuvent présenter des différences fondamentales que vous ne pourrez peut-être pas résoudre avec des typedefs simples. Par exemple, std :: sort peut être utilisé avec std :: vector mais pas std :: list. En fonction de ce que votre code fait (ou pourrait devoir faire dans le futur), essayer de le garder vraiment indépendant du type peut prendre plus de temps qu'il n'en vaut la peine. Mais vous devrez l'évaluer vous-même.

Questions connexes