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 :

Spécialisation de template


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut Spécialisation de template
    Bonjour, j'aimerais votre avis car je ne sais pas comment spécialiser une classe à l'intérieur d'un classe elle même template, sur g++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename T>
    struct Foo
    {
        template<typename U>
        void f() { /* Plein de code ici... */ }
     
    };
    Comment faire ici pour spécialiser la fonction A::f() pour les int par exemples? Car si je le fais à l'intérieur de la classe j'ai une erreur de g++ qui dis que c'est impossible "error: invalid explicit specialization before '>' token" et je trouve pas de solution.

    Et je n'arrive pas à le faire en dehors de la classe.

    Merci d'avance ppour votre aide!

  2. #2
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Par défaut
    Bonjour,
    Si tu veux seulement spécialiser la fonction template en gardant le patron de classe généralisé, ce n'est pas possible.
    Il faut que tu spécialise ta classe dans laquelle tu pourras spécialiser à son tour la méthode : exemple :

    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
     
    #include <iostream>
     
    using namespace std ;
     
    template <typename T>
    struct foo
    {
    	template <typename U>
    	static void bar () ;
    };
     
    template<> template <>
    void foo<float>::bar<int> () { cout << "float, int" << endl ;}
     
    template <> template <>
    void foo<double>::bar<float> () { cout << "double, float" << endl ;}
    int main ()
    {
    	foo<float>::bar<int>() ;
    	foo<double>::bar<float> () ;
    	cout << "zou !" << endl ;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float, int
    double, float
    zou !
    Press any key to continue . . .

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    (efface, efface, efface)

    Regis a répondu avant moi.

    Tu peux faire un peu plus fun cependant : si f() appelle une fonction statique dans une classe template, cette classe peut être spécialisée selon le paramètre template de f().

    Exemple :

    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
     
    #include <iostream>
     
    namespace details
    {
      template <class U>
      struct Fimpl
      {
        static void impl() { std::cout << "non spécialisé" << std::endl; }
      };
     
      template <>
      struct Fimpl<int>
      {
        static void impl() { std::cout << "<int>" << std::endl; }
      };
    }
     
    template <class T>
    struct A
    {
      template <class U>
      void f() { details::Fimpl<U>::impl(); }
    };
     
    int main()
    {
      A<float>().f<char>();
      A<float>().f<int>();
    }
    C'est la technique que j'utilise pour spécialiser partiellement les méthodes (puisque ce n'est pas censé être possible).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Par défaut
    très joli emmanuel

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    merci c'est bien les astuces auquel je ne pouvais pas penser

    En tout cas merci beaucoup à vous deux!

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    [...]
    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
     
    #include <iostream>
     
    namespace details
    {
      template <class U>
      struct Fimpl
      {
        static void impl() { std::cout << "non spécialisé" << std::endl; }
      };
     
      template <>
      struct Fimpl<int>
      {
        static void impl() { std::cout << "<int>" << std::endl; }
      };
    }
     
    template <class T>
    struct A
    {
      template <class U>
      void f() { details::Fimpl<U>::impl(); }
    };
     
    int main()
    {
      A<float>().f<char>();
      A<float>().f<int>();
    }
    C'est la technique que j'utilise pour spécialiser partiellement les méthodes (puisque ce n'est pas censé être possible).
    Ici, il y a un problème: la méthode spécialisée n'a pas accès aux paremètre template parent (ie celui de la classe A).

    il faudrait probablement donner deux paramètres à U et utiliser une spécialisation partielle pour obtenir un résultat similaire à une spécialisation partielle de méthode.

    Citation Envoyé par victor_gasgas Voir le message
    merci c'est bien les astuces auquel je ne pouvais pas penser

    En tout cas merci beaucoup à vous deux!
    noublie pas la balise

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Oui oui j'oublie jamais la balise résolu en temps normal, mais je suis bien confronté au problème que tu cites à savoir ne pas avoir accès au paramètres templates de l'appelant.

    Et je n'arrive pas à mettre en œuvre t'as dernières techniques énoncer.

    Je sais que j'en demande un peu beaucoup mais la métaprog. reste encore obscure pour moi. Encore merci.

  8. #8
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    en reprennant le code d'Emmanuel Deloget, on obtient ça:
    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
    #include <iostream>
    #include <typeinfo>
     
    namespace details
    {
      template <class T,class U>
      struct Fimpl
      {
        static void impl() { std::cout << "non spécialisé" << std::endl;}
      };
     
      template <class T>
      struct Fimpl<T,int>
      {
        static void impl() { std::cout << "<int>" << std::endl;
                               std::cout << "le deuxieme type est " <<typeid(T).name()<<std::endl; }
      };
    }
     
    template <class T>
    struct A
    {
      template <class U>
      void f() { details::Fimpl<T,U>::impl(); }
    };
     
    int main()
    {
      A<double>().f<char>();
      A<double>().f<int>();
    }
    voilà

    bonne chance pour la suite

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Merci beaucoup c'est exactement ce qu'il me fallait

    Bonne journée à tous!

  10. #10
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Ici, il y a un problème: la méthode spécialisée n'a pas accès aux paremètre template parent (ie celui de la classe A).

    il faudrait probablement donner deux paramètres à U et utiliser une spécialisation partielle pour obtenir un résultat similaire à une spécialisation partielle de méthode.
    Judicieux ! Je n'y avait pas pensé, mais c'est vrai que c'est très logique
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Spécialisation de template particulière
    Par Flo. dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2009, 22h18
  2. Spécialisation de template parametre avec Enum
    Par 3DArchi dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2008, 15h21
  3. Spécialisation de template
    Par bobyjoe dans le forum Langage
    Réponses: 18
    Dernier message: 13/12/2007, 21h52
  4. Réponses: 8
    Dernier message: 24/04/2007, 22h09
  5. Réponses: 7
    Dernier message: 01/01/2006, 03h28

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