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

Langage C++ Discussion :

[Template] spécialisation partielle des template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut [Template] spécialisation partielle des template
    Bonjour à tous,

    J'ai un petit problème en utilisant la spécialisation partielle des template (si ca s'appelle bien comme ca). J'ai une bête fonction templatisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <class Container,class Functor, class Flag >
    void inspect( Container & x, Functor & fun ) 
    { 
           //fait un truc
    }
    et j'aimerais la spécialiser en fonction du paramètre template Flag. J'ai tenté d'ajouter ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct suppress;
     
    template <class Container,class Functor>
    void inspect<Container,Functor,suppress>( Container & x, Functor & fun ) 
    {
           //fait un autre truc 
    }
    L'erreur (sous Visual) est la suivante:
    "error C2768: 'inspect' : illegal use of explicit template arguments"
    Quelqu'un connaitrait-il la syntaxe à employer?
    Merci d'avance

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Pas tres clair le message, je suppose qu'il est du au fait qu'on ne peut pas specialiser partiellement les fonctions templates.

  3. #3
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Merci pour la reponse si rapide!
    Bon, comme tu le dis, c'est peut-etre pas autorisé au final. Mais vu qu'il existe la spécialisation de fonctions template et la specialisation partielle de classes, je me suis dis "Pourquoi pas la specialisation partielle de fonctions template?".
    Je laisse le post ouvert, au cas où un developpeur de chez Microsoft viendrait jeter un coup d'oeil et repondrait

  4. #4
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Autant pour moi, avec google et de meilleurs mots clés, il s'avers que cela n'existe pas du tout. Je vais filouter avec des classes template partiellement specialisées alors.

  5. #5
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Bon, pour ceux que ca interesse, j'ai trouvé une maniere de contourner le probleme. A la base, je voulais faire de la specialisation partielle de fonction template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    struct suppress;
    struct merge;
    struct classif;
    struct for_each;
     
    template <class Container, class Functor, class Flag>
    void inspect( Container & x, Functor & fun )
    {
    	//fait un truc
    }
     
    template <class Container, class Functor>
    void inspect<Container, Functor, suppress> ( Container & x, Functor & fun )
    {
    	//fait un autre truc
    }
     
    template <class Container, class Functor>
    void inspect<Container, Functor, merge> ( Container & x, Functor & fun )
    {
    	//fait encore un autre truc
    }
     
    //etc...
     
     
    //et la fonction generique que j'appelle:
    template <class Container, class Functor>
    void inspect_generic ( Container & x, Functor & fun )
    {
    	inspect<Container,Functor, Functor::flag_iter_process>( x, fun);
    }
    Le but etant de parcourir le container "x" en applicant le foncteur "fun". Or, la maniere de parcourir le container (generalement une liste) varie en fonction du foncteur utilisé. C'est pour cela que mes foncteurs definissent tous un type "flag_iter_process" qui est un simple typedef sur mes structures "suppress", "merge" et compagnies. Cela m'aurait permis d'appeler la fonction "inspect_generic " de cette maniere: inspect_generic ( ma_list, mon_foncteur)" en etant sûr que la methode de parcours de la liste soit bien adaptée au foncteur utilisé.

    Ma methode de remplacement est la suivante : je créé une classe doublement template contenant une fonction static template simple que je vais specialiser. Cela donne:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    template <class Container, class Functor>
    class Inspect
    {
    public:
     
     
    	template< class Flag >
    	static void inspect_container(Container & x, Functor & fun)
    	{}
     
    	template<>
    	static void inspect_container<suppress>(Container & x, Functor & fun)
    	{
    		//fait un truc	
                 }
     
    	template<>
    	static void inspect_container<merge>(Container & x, Functor & fun)
    	{
    		//fait un autre truc
    	}
     
    	template<>
    	static void inspect_container<classif>(Container & x, Functor & fun)
    	{
    		//encore un autre truc
    	}
     
    	//etc...
    };
     
     
    //la fonction generique à appeler
    template <class Container,class Functor>
    void inspect( Container & x, Functor & fun ) 
    { 
    	Inspect<Container,Functor>::inspect_container<Functor::flag_iter_process>( x, fun );
    }
    En fait, je délègue les deux premiers arguments template à la classe pour pouvoir ensuite specialiser ma fonction. Et ca marche du feu de Dieu!!!

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    C'est effectivement LA méthode de référence.

    Elle est donné dans la FAQ il me semble

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par vikki Voir le message
    Merci pour la reponse si rapide!
    Bon, comme tu le dis, c'est peut-etre pas autorisé au final.
    Je n'ai pas ete clair. Je suis certain qu'on ne peut pas specialiser partiellement les fonctions.

    Mais vu qu'il existe la spécialisation de fonctions template et la specialisation partielle de classes, je me suis dis "Pourquoi pas la specialisation partielle de fonctions template?".
    J'ai rien vu dans D&E qui concerne le specialisation partielle en general, sans parler de leur interdiction pour les fonctions.

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

Discussions similaires

  1. Spécialisation partielle de template
    Par darkman19320 dans le forum C++
    Réponses: 2
    Dernier message: 24/02/2015, 12h07
  2. Spécialisation partielle de template template
    Par oodini dans le forum Langage
    Réponses: 2
    Dernier message: 12/03/2012, 18h40
  3. Template spécialisation partielle
    Par saladin04 dans le forum Langage
    Réponses: 6
    Dernier message: 06/03/2011, 20h59
  4. [Template] Spécialisation partielle d'un template
    Par Kurisu dans le forum Langage
    Réponses: 31
    Dernier message: 25/11/2008, 22h21
  5. Réponses: 4
    Dernier message: 04/09/2008, 10h58

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