En programmation générique, les composants logiciels sont paramétrés sur des types. Quand il est disponible, un mécanisme de spécialisation statique permet de sélectionner, pour un jeu de paramètres donné, une version plus adaptée d'un composant générique que sa version initiale. Le mécanisme normal de spécialisation de patron du C++ repose sur le motif de type des paramètres, ce qui n'est pas toujours la meilleure manière de guider le processus de spécialisation: les motifs de type manquent certaines informations sur les types qui pourraient être pertinentes pour définir des spécialisations. La notion de "concept", qui représente un ensemble de spécifications (incluant des aspects syntaxiques et sémantiques) pour un type, est reconnue pour être une approche intéressante pour contrôler la spécialisation de patron. Pour diverses raisons, les concepts ont été abandonnés dans le standard C++11, le rapport de recherche décrit donc des techniques de métaprogrammation par patrons pour déclarer des concepts, des relations de "modélisation" (signifiant qu'un type satisfait les spécifications d'un concept) et des relations de "raffinement" (signifiant qu'un concept raffine les spécifications d'un autre concept). La bibliothèque C4TS++, qui signifie "Concepts for Template Specialization in C++", implémente la solution présentée dans le rapport. Le code source de la bibliothèque, les exemples discutés dans le rapport, et le générateur d'instances aléatoires utilisé pour mesurer les performances de la bibliothèque sont disponibles ici.
La bibliothèque est écrite en C++ standard et deux versions sont disponibles: la version simple qui a été développée dans un but de compréhension, et qui est présentée dans le rapport; et la version optimisée qui améliore le temps de compilation. Les fichiers listés ci-dessous font partie de la version simple.
Les exemples discutés dans le rapport sont présentés ici. Les trois premiers abordent la difficulté de fournir une classe générique pour la sérialisation d'objets, en utilisant la spécialisation de patron traditionnelle reposant sur les motifs de type, et deux autres solutions existantes. Les deux derniers exemples utilisent la bibliothèque C4TS++, respectivement pour aborder le problème de la sérialisation et pour illustrer le mécanisme original proposé pour sélectionner les spécialisations.
Des expériences ont été réalisées pour mesurer le surcoût en temps de compilation engendré par la bibliothèque. Des instances de spécialisation par concepts ont été générées aléatoirement avec différents nombres de concepts et de relations de modélisation/raffinement.
Les expériences confirment l'analyse de performance théorique du rapport: utiliser les concepts pour contrôler la spécialisation de patron engendre un surcoût de O(n2 + rn) opérations à la compilation. Même si une dépendance quadratique au nombre de concepts a été identifiée, le temps de compilation est raisonnable pour la plupart des applications: compiler 50 spécialisations avec 50 concepts et 250 relations de modélisation/raffinement sur un ordinateur moyen (e.g. Intel Core 2 Duo T8100 2.1 GHz) nécessite moins de 5 secondes.
Des rapports techniques fournissent des informations supplémentaires sur la conception et l'utilisation de la bibliothèque C4TS++.
Vous pouvez télécharger le de la bibliothèque et de tous les fichiers additionnels présentés ici. Il a été testé avec succès sur différents compilateurs: GNU GCC, Microsoft Visual C++ et Embarcadero C++. |