PATRONS D'EXPRESSIONS AVEC CONCEPTS
Bibliothèque ETC++
 
 
INTRODUCTION
 

Les concepts seront probablement introduits dans une future norme du C++. Ils servent notamment à contraindre les paramètres d'un patron, ce qui permet de vérifier des exigences sur des paramètres du patron plus tôt dans le processus de compilation, et de fournir ainsi des messages d'erreur plus compréhensibles pour l'utilisateur.

Ils peuvent servir aussi dans la spécialisation des patrons, conduisant alors à un meilleur contrôle de la sélection de la version la plus appropriée d'un patron pour une instanciation donnée. Ce dernier aspect offre de nouvelles possibilités pour la conception de bibliothèques génériques, car il améliore le mécanisme de spécialisation des patrons et le positionne comme une solide alternative à l'héritage quand la liaison statique peut remplacer la liaison dynamique.

Le rapport de recherche aborde la conception de patrons d'expressions (template expressions, i.e. des patrons qui représentent des expressions et sont généralement construits par le biais de la surcharge d'opérateurs) qui sont utiles pour développer un langage dédié embarqué (Embedded Domain Specific Language - EDSL), et peuvent accélérer l'évaluation d'une expression en retardant l'évaluation d'opérations intermédiaires afin d'éviter des objets temporaires inutiles.

La bibliothèque ETC++, "Expression Templates with Concepts 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 l'application de la bibliothèque à la programmation linéaire sont disponibles ici.

 
BIBLIOTHEQUE ETC++
 

La bibliothèque est compatible avec le standard C++11 et se compose de trois fichiers pour, respectivement, modéliser des patrons d'expressions, surcharger des opérateurs et évaluer des expressions.

  • etc_expression.hpp
    Fournit des éléments de métaprogrammation pour modéliser les patrons d'expressions.

  • etc_operator.hpp
    Fournit des éléments de métaprogrammation pour surcharger des opérateurs.

  • etc_visitor.hpp
    Fournit des éléments de programmation pour évaluer des patrons d'expressions.

 
EXEMPLES
 

Les exemples discutés dans le rapport sont présentés ici. Le premier introduit la syntaxe de la utilisée pour manipuler les concepts. Les deux exemples suivants illustrent l'utilisation des patrons d'expressions pour des opérations de tableaux, le premier avec l'approche classique et le second avec la bibliothèque ETC++. Le dernier exemple montre comment utiliser les patrons d'expressions quand l'effacement de type (type erasure) est nécessaire.

  • c4ts.cpp
    Montre un exemple de spécialisation orientée concept avec la .

  • et_classic.cpp
    Montre un exemple de patrons d'expressions pour des tableaux avec l'approche classique.

  • et_concepts.cpp
    Montre un exemple de patrons d'expressions pour des tableaux avec ETC++.

  • type_erasure.cpp
    Montre un exemple de patrons d'expressions utilisant le type erasure avec ETC++.

 
APPLICATION A LA PROGRAMMATION LINEAIRE
 

La bibliothèque a été utilisée pour concevoir un EDSL pour la programmation linéaire comme présenté dans le rapport. Cet exemple se compose de plusieurs fichiers qui implémentent la structure d'un programme linéaire (variables, contraintes, objectif) et définissent un EDSL pour construire des expressions linéaires, des contraintes et des objectifs à insérer dans un programme linéaire.

Avec seulement 8 spécialisations du visiteur utilisées pour évaluer les patrons d'expressions, la vérification, la construction et la simplification d'une expression ou d'une contrainte linéaire ont été définies avec notre bibliothèque. Grâce aux concepts, l'évaluation d'une expression est totalement contrôlée: la sélection d'une version spécialisée du visiteur n'est possible que si l'opérande modélise le concept spécifié, et des assertions reposant sur les concepts permettent des contrôles supplémentaires pour valider la syntaxe.

 
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 les compilateurs GNU GCC et Clang.