CONTROLER LA SPECIALISATION DE PATRON
PAR LES CONCEPTS EN C++
Bibliothèque C4TS++
 
 
INTRODUCTION
 

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.

 
BIBLIOTHEQUE C4TS++
 

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.

  • gnx_basic.hpp
    Fournit des éléments fondamentaux de métaprogrammation.

  • gnx_list.hpp
    Fournit des éléments de métaprogrammation pour manipuler des listes de types.

  • gnx_concept.hpp
    Fournit des éléments de métaprogrammation pour la spécialisation par concepts.

 
EXEMPLES
 

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.

 
ANALYSE DE PERFORMANCE
 

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.

  • generate_instance.cpp
    Génère une instance aléatoire de spécialisation par concepts pour la bibliothèque C4TS++. Le nombre n de concepts, le nombre r de relations, la métafonction x à tester et le nombre p d'appels à cette métafonction doivent être fournis.

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.

 
DOCUMENTS
 

Des rapports techniques fournissent des informations supplémentaires sur la conception et l'utilisation de la bibliothèque C4TS++.


  • Explique comment les opérations logiques ont été ajoutées à la bibliothèque C4TS++.


  • Présente des solutions pour éviter un effet "chat de Schrödinger" des templates, en particulier lors de l'utilisation de la bibliothèque C4TS++. Le des exemples discutés dans le document est fourni.

 
TELECHARGEMENT
 

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++.