6
votes

Dans la programmation générique / TMP World, quelle est exactement un modèle / une politique et un "concept"?

J'aimerais connaître les définitions précises mais succinctes de ces trois concepts au même endroit. La qualité de la réponse doit dépendre des deux points suivants.

  1. Affiche un simple extrait de code pour montrer comment et ce que le concept / technique est utilisé pour.
  2. Soyez assez simple pour comprendre afin qu'un programmeur sans exposition à cette zone puisse la saisir.

    Note:

    Il y a probablement de nombreuses réponses correctes depuis que chaque concept a de nombreuses facettes différentes. Si Il y a beaucoup de bonnes réponses, je finirai éventuellement à résoudre la question en CW et à agréger les réponses.

    - Post Accepter Edition -

    Boost a une belle Article sur des concepts de programmation générique


0 commentaires

3 Réponses :


2
votes

Un concept est un ensemble d'exigences qu'un type doit satisfaire pour modéliser le concept.

Par exemple, un type t est moins -ancomparable si pour un Paire d'objets A et B de type t L'expression A est bien formé, convertible vers < Code> BOOL et induit une relation de commande stricte faible. Le type INT est un exemple d'un modèle de Mestimomparable .

concepts peut former des hiérarchies de raffinement. Concept A est un raffinement du concept B si les exigences de A sont une superset des exigences du B . Par exemple, Bidirectionaliterator est un raffinement de < Un href = "http://www.sgi.com/tech/stl/forworatiterator.html" rel = "nofollow noreferrer"> Forfaititerator .

concepts sont utilisés pour limiter l'ensemble des types qu'un modèle peut être spécialisé avec. Par exemple, l'algorithme std :: tri peut accepter une paire d'objets tant qu'ils modélisent aléatoireAccessiterator . xxx

Notez que les concepts sont des objets informels utilisés dans la norme C ++ et divers documents . La langue ne prend pas en charge les concepts directement ( pourtant ).


0 commentaires

2
votes

a.o. La documentation SGI fait référence au "modèle" sur ce qui a été introduit en tant que "concepts" dans une proposition C ++ 0X: c'est l'équivalent de compilation équivalente à une "interface" dans la modélisation OO. Il résume les exigences que le code générique pose sur un paramètre de modèle.

Comme exemple, vous pouvez dire que les paramètres OUTPUTITERATORATORATORATOR (code> de la fonction STD :: Transform doivent mettre en œuvre opérateur ++ () et et et opérateur = (t) Pour que la fonction fonctionne.

La stratégie est une autre chose: il fait un algorithme modifiable de l'extérieur. Un bon exemple est le paramètre allocator usagé des conteneurs STL: il indique à l'algorithme comment allouer de la mémoire. Si on veut, on peut faire un std :: vecteur , où l'ensemble des fonctions vectorielles allouerait la mémoire dans le nuage au lieu de tas. (Je ne suis pas apte à mettre en œuvre cet allocator, l'esprit).


0 commentaires

8
votes

a concept em> est un ensemble d'exigences sur un type. Par exemple, vous pourriez avoir un concept appelé "RandomAsstibleable", qui place l'exigence sur un type qui implémente opérateur [] (int) code> in o (1) heure.

Comme les concepts ont été supprimés. À partir de la norme C ++ à venir, elles n'existent que de manière intangible en C ++ comme documentation. Par exemple, vous pouvez lire Description de SGI du concept de conteneur . P >

Lorsqu'un type répond à toutes les exigences d'un concept, vous appelez cela un modèle em> de ce concept. Par exemple, std :: vecteur code> est un modèle du concept de conteneur (ou, de manière équivalente std :: vecteur code> "modèles" conteneur). P>

Enfin, une stratégie est une unité de comportement, qui peut être combinée à d'autres unités de comportement pour créer des classes complexes. Par exemple, disons que vous vouliez créer deux classes: une matrice de taille fixe et une matrice redimensionnable dynamiquement. Ces deux classes ont beaucoup de fonctionnalités partagées, mais elles diffèrent simplement dans leurs mécanismes de stockage et certaines de leurs fonctionnalités (par exemple, vous ne pouvez pas appeler push_back code> sur une matrice de taille fixe). P>

int main()
{
  array<int, fixed_storage<int, 10> > fixed_array;
  array<int, dynamic_storage<int> > dynamic_array;

  dynamic_array.push_back(1);
  fixed_array[9] = dynamic_array[0];
}


0 commentaires