type "erasable"

Le problème exposé dans ce sujet a été résolu.

Bonjour.

Je suis amené dans le cadre d’un Entity Component System (encore lui) à réinventer la roue et à programmer un vector acceptant plusieurs types en paramètres template. Il se base sur un tuple et des tableaux dynamiques gérés par la classe en interne.

Afin de rester fidèle à la version initiale du vector, j’ai jeté un petit coup d’œil à la doc' et suis tombé sur l’énigmatique passage

Generally, it is required that element type is a complete type and meets the requirements of Erasable, but many member functions impose stricter requirements.

ce qui traduit en français donne

Généralement, il est requis que le type de l’élément soit complet et remplisse la condition "être Erasable" (en gros), mais beaucoup de méthodes imposent des restrictions plus strictes.

Après avoir lu cette page, je ne suis pas plus avancé. Ma question est donc "concrètement, en quoi consiste Erasable, que dois-je faire pour qu’une classe supporte toutes les fonctionnalités du vector et donc quelles restrictions dois-je imposer aux classes des utilisateurs de mon container (les réponses des questions 2 et 3 sont les mêmes)?

Merci d’avance :) .

Ce que le passage traduit c’est qu’à minima pour écrire std::vector<T> v; T doit être complet (pas juste une forward déclaration) et Erasable.

Si en plus tu commences à utiliser des méthodes de la classe vector, alors elles vont imposer d’autres contraintes sur T (car classes template oblige, elle ne sont pas instanciées tant que non utilisées).

Quant à Erasable, je vois pas bien quoi rajouter en fait, c’est une définition et c’est comme ca. Pour que T soit Erasable Il faut que l’expression std::allocator_traits<A>::destroy(m, p); soit bien formée étant donné :

  • un allocateur A tel que X::allocator_type soit identique à std::allocator_traits<A>::rebind_alloc<T> -m une lvalue de type A
  • p un T*

Globalement, on doit pouvoir libérer la mémoire pointée par le biais d’un allocateur.

+0 -0

Tout d’abord, merci de ta réponse (et désolé d’avoir été un peu long).

Après avoir replongé dans la doc’, je crois avoir compris que pour que l’expression std::allocator_traits<A>::destroy(m, p); soit bien formée, il faut que T::~T() soit accessible (j’entends par là public ou membre d’une classe amie) / existant. Est-ce bien ça?

Toujours est-il que je ne connais toujours pas les autres propriétés requises (par exemple, je suppose que T doit être constructible par copie, peut-être assignable par copie, etc…), ce qui est embêtant. Vois-tu d’autres propriétés?

Les exigences sur T sont dans la doc

Merci de me prévenir mais c’est justement sur cette page que j’ai lu cette phrase qui me fait tiquer.

Sinon, y’a des exemples de ce que tu souhaites faire

Effectivement, ça y correspond. Je n’ai pas encore tout lu mais ça devrait être assez instructif (et en voyant les exigences du container, je devrais pouvoir déterminer qu’est-ce qui est nécessaire).

Merci beaucoup pour ces réponses ;) !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte