IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

spécialisation de méthode template


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut spécialisation de méthode template
    Bonjour à tous,

    Dans le but de me faciliter la vie, je voudrais me faire une méthode template qui me détermine si un élément est présent dans une collection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<typename Collection> bool isIn(Collection const& c, typename Collection::value_type const& e)
    {
      return std::find(c.begin(), c.end(), e) != c.end();
    }
    Le truc c'est que je voudrais également bénéficier des optimisations dans le cas de collections ordonnées, je pensais donc faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<typename Collection> bool isIn(Collection const& c, typename Collection::key_type const& e)
    {
      return c.find(e) != c.end();
    }
    Le truc c'est que pour les std::set, le key_type et le value_type font référence au même type, je me retrouve donc avec une double instantiation avec les même types à la compilation et je me fait donc jeter comme un malpropre. Auriez-vous une idée pour pouvoir contourner ce problème?
    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Si tu peux utiliser boost regarde du côté de boost::disable_if associé par exemple à un boost::mpl::equal.
    Le but étant de désactiver une des deux méthodes lorsque value_type et key_type sont identiques.

    MAT.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Bah en fait sinon il suffit d'ajouter une version dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        template< typename T, typename C, typename A > bool isIn( std::set< T, C, A > const& c, typename std::set< T, C, A >::key_type const& e )
        {
            return c.find(e) != c.end();
        }
    ....

    MAT.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    J'étais parti sur boost::disable_if mais je me disais bien que la solution était un poil complexe En tout cas merci beaucoup, la solution marche nickel!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/10/2013, 10h46
  2. [FaQ C++] Comment spécialiser une méthode template
    Par méphistopheles dans le forum Contribuez
    Réponses: 0
    Dernier message: 03/02/2011, 22h35
  3. Réponses: 19
    Dernier message: 23/12/2009, 19h22
  4. Spécialisation de méthode membre de classe template
    Par Zbouirf dans le forum Langage
    Réponses: 3
    Dernier message: 23/07/2008, 02h30
  5. Méthode template virtuelle
    Par ced1 dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2005, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo