Je voudrais savoir comment tuple est implémenté dans la bibliothèque standard pour C++ 0x. J'ai essayé de lire description in libstdc++ manual puis de lire template listing, mais il est vraiment difficile de comprendre comment cela fonctionne, en particulier lors de la lecture du code. Est-ce que quelqu'un peut m'expliquer en quelques phrases l'idée de l'implémentation de tuple? Je veux savoir ceci, parce que je pense utiliser des tuples dans mon code et je veux comprendre comment cela fonctionne et quel type de surcharge apporte-t-il (étend le temps de compilation seulement, effectue de nombreuses opérations de copie en mémoire, exécute beaucoup d'autres fonctions dans le constructeur , etc.).Comment std :: tuple est-il implémenté?
Répondre
Une approche pour implémenter des tuples utilise l'héritage multiple. Les éléments-tuple sont détenus par des classes-feuilles, et la classe tuple elle-même hérite de plusieurs feuilles. En pseudo-code:
template<typename T0, typename T1, ..., typename Tn>
class PseudoTuple : TupleLeaf<0, T0>, TupleLeaf<1, T1>, ..., TupleLeaf<n, Tn> {
...
};
Chaque feuille a un indice, de sorte que chaque classe de base devient unique même si les types qu'ils contiennent sont identiques, afin que nous puissions accéder à l'élément n-ième avec un simple static_cast:
static_cast<TupleLeaf<0, T0>*>(this);
// ...
static_cast<TupleLeaf<n, Tn>*>(this);
J'ai écrit une explication détaillée au sujet de cette mise en œuvre tuple « plat » ici: C++11 tuple implementation details (Part 1)
La mise en œuvre std::tuple
est possible via variadic templates, qui ont été introduites dans le langage principal. Je sais que c'est implorer la question, mais il vous donne une meilleure recherche de phrase à rechercher.
de plus, la mise en œuvre est * pas * trivial, comme en témoigne le fait que l'OP mentionné essayer et de ne pas comprendre par la rea ding le code d'un exemple de mise en œuvre. –
Cette réponse est en cours de discussion [sur meta] (http://meta.stackoverflow.com/questions/290254/for-the-question-how-is-x-implemented-is-its-trivial-using-feature-y -an-an). – Daedalus
@KyleStrand le PO a lu le code en 2010 lorsque les modèles variés n'étaient pas encore compris. Je lui ai donné les outils pour comprendre les modèles variés. Je considère que c'est une réponse. – Motti
Un tuple est généralement implémenté sous la forme d'une liste chaînée liée à la compilation.
Le code est un peu obscurcie par modèle syntaxe, mais les éléments suivants sont normalement présents:
- une chaîne de classes avec des éléments de tête et de queue (contre-éléments)
- une instance de queue vide à indique la fin de la liste.
- code récursif pour parcourir la liste jusqu'à un certain index, implémenté sous la forme d'instanciations de modèle récursives (instanciées au moment de la compilation).
Il existe des implémentations raisonnables dans C++ 03 (par exemple boost).
Les modèles Variadic autorisent un nombre illimité d'éléments, comme mentionné par Motti.
Le coût est normalement un temps de compilation. Les constructeurs de copies peuvent être appelés pendant l'initialisation (max 1) et lors de la copie des tuples eux-mêmes.
Oui c'est une bonne explication! Malheureusement, ce n'est pas la façon dont le tuple est implémenté dans libstdC++, que l'on colle à l'implémentation récursive. Impossible d'attendre une libC++ plus largement distribuée! –
Il peut également être utile de décrire brièvement l'implémentation non récursive. –
@KyleStrand erm, ceci est l'implémentation non récursive (T: L1, L2, L3 vs T: L1: L2: L3 de l'implémentation récursive) – mitchnull