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   -
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

2 réponses

  1. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    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
    1. Franck7511 Messages postés 14571 Date d'inscription   Statut Membre Dernière intervention   1 121
       
      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
  2. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    '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
    1. Franck7511 Messages postés 14571 Date d'inscription   Statut Membre Dernière intervention   1 121
       
      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
    2. Franck7511 Messages postés 14571 Date d'inscription   Statut Membre Dernière intervention   1 121
       
      Up please!
      0