2012-11-13 2 views
8

Je suis simplement curieux à propos de l'implémentation de boost::variant.boost :: variante d'implémentation

Est-ce que ça fonctionne comme ça?

Deux membres:

  1. Un certain nombre représentant le type actuellement stocké (par exemple 0 pour le premier paramètre de modèle, 1 pour le second paramètre de modèle, etc)
  2. Une union de tous les types possibles (qui, bien sûr la taille du plus grand).

apply_visitor():

a une déclaration switch sur le nombre représentant le type actuellement stocké pour appeler la surcharge correcte (ce qui dans le pire des cas être compilé en tant que table de saut prenez donc le temps constant).

Je comprends qu'il y a aussi un certain nombre d'optimisations qui peuvent boost::variant n'a pas besoin d'allouer dynamiquement de la mémoire comme détaillé here, mais je pense que je les ai.

+0

Vous pouvez réellement regarder le code source et peut-être même la documentation pourrait indiquer comment il est implémenté. Je m'attendrais à un tampon (tableau char de type suffisant) et une étiquette pour déterminer comment interpréter le tampon. –

+1

Excuses d'avance, mais vous avez regardé la source, non? Vous devriez être capable de comprendre exactement comment cela fonctionne, soit en étudiant les sources, soit en construisant une application de test et en passant par un débogueur, non? – Bukes

Répondre

7

Cela fonctionne à peu près comme vous l'avez décrit. Longue histoire courte:

  1. Il a un entier which qui indique quel type de données est utilisé.

  2. Le stockage est implémenté en utilisant le aligned_storage de boost qui est essentiellement un tampon de la taille maximale des données. (Il est dans une union, mais à des fins d'alignement)

Enfin, le visiteur est en effet mis en œuvre avec un switch, généré au moment de la compilation en utilisant des macros pour déroulez toutes les possibilités de type.

Questions connexes