Modifier type std::allocator

Fermé
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - Modifié par Franck7511 le 15/03/2016 à 10:33
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - 20 mars 2016 à 15:11
Bonjour,

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
A voir également:

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
15 mars 2016 à 15:27
Bonjour,

À si Visual plante! Et en essayant
std::vector<K, typename Alloc::rebind<K>::other> Vec2;
std::vector<K, std::allocator_traits<Alloc>::rebind_alloc<K>> Vec2;
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
Modifié par Franck7511 le 15/03/2016 à 15:56
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
0
ElementW Messages postés 4814 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 227
Modifié par gravgun le 15/03/2016 à 19:25
'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
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
Modifié par Franck7511 le 15/03/2016 à 21:02
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!
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
20 mars 2016 à 15:11
Up please!
0