Modifier type std::allocator
Franck7511
Messages postés
14571
Date d'inscription
Statut
Membre
Dernière intervention
-
Franck7511 Messages postés 14571 Date d'inscription Statut Membre Dernière intervention -
Franck7511 Messages postés 14571 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai une classe avec un template du style
Qu'est ce que je pourrais mettre à la place des points d'interrogation ?
J'ai pensé à Alloc::rebind<K> mais ça me fait planter (oui oui) le compilateur de Visual Studio.
Merci de votre aide
J'ai une classe avec un template du style
template<class T, class K, class Alloc = std::allocator<T> >
class MyClass {
std::vector<T, Alloc> Vec1;
std::vector<K, ?????> Vec2;
};
Qu'est ce que je pourrais mettre à la place des points d'interrogation ?
J'ai pensé à Alloc::rebind<K> mais ça me fait planter (oui oui) le compilateur de Visual Studio.
Merci de votre aide
2 réponses
-
Bonjour,
À si Visual plante! Et en essayantstd::vector<K, typename Alloc::rebind<K>::other> Vec2; std::vector<K, std::allocator_traits<Alloc>::rebind_alloc<K>> Vec2;
-
Bonjour,
J'ai modifié le programme en conséquence, j'ai désormais :
template<class __T> using Layer = std::vector<__T, std::allocator_traits<Alloc>::rebind_alloc<__T> >; template<class __T> using Map = std::vector<Layer<__T> >;
Mais idem, toujours une erreur... "Argument modèle non valide pour '__Alloc', type attendu
Merci
-
-
'lut
Pourquoi ne pas passer un type d'allocateur pour tous les vector?template<class T, class K, template<typename> class Alloc = std::allocator> class MyClass { std::vector<T, Alloc<T> > Vec1; std::vector<K, Alloc<K> > Vec2; };Ou si on veut spécifier spécialement ceux pour T et K (celui de K étant celui de T par défaut)(et peut-être pour tous les autres types qui peuvent suivre):template<class T, class K, template<typename> class AllocT = std::allocator, template<typename> class Alloc = AllocT> class MyClass { std::vector<T, AllocT<T> > Vec1; std::vector<K, Alloc<K> > Vec2; };
from human import idiocy
del idiocy-
Bonjour,
C'est une bonne idée mais je voudrais garder une compatibilité avec le standard...
Toutefois, si je peux "récupérer" std::allocator à partir de std::allocator<__Ty> ça pourrait être une piste, non ?
J'essaie ça :
template <class K, class T, class _Alloc = std::allocator<K> > class MyClass { template<typename __T> using Alloc = typename _Alloc::rebind<__T>::other; template<typename __T> using Layer = std::vector<__T, Alloc<__T> >; template<typename __T> using Map = Layer<Layer<__T> >; /* ... */ }
Et ça ne marche pas.
Par contre, ça :
template <class K, class T, /*, class _Alloc = std::allocator<K>*/ > class MyClass { template<typename __T> using Alloc = typename std::allocator<K>::rebind<__T>::other; template<typename __T> using Layer = std::vector<__T, Alloc<__T> >; template<typename __T> using Map = Layer<Layer<__T> >; /* ... */ }
Fait bien ce que je veux. Idem avec la version allocator_traits.
Mais l'idée c'est d'utiliser avec d'autres allocators :)
Merci de votre aide! -
-