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 :

Que signifie typenameT::typePerso en argument de fonction + SFINAE


Sujet :

Langage C++

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 63
    Par défaut Que signifie typenameT::typePerso en argument de fonction + SFINAE
    Bonjour !

    J'essaye de comprendre SFINAE et j'ai pris le code donné en exemple typique

    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
        //On définie une structure Test
        //Contenant un int personnalisé
        struct Test {
            typedef int monInt;
        };
     
        //On définie une méthode prenant en argument...
        template <typename T>
        void f(typename T::monInt)
        {
            cout << "Methode 1" << endl;
        }
     
        //Et une autre prenant en argument un template classique
        template <typename T>
        void f(T)
        {
            cout << "Methode 2" << endl;
        }
     
        int main()
        {
     
            f<Test>(10);//Appelle la méthode 1
            f<int>(10);//Appelle la méthode 2 sans erreur grace à SFINAE
     
            return 0;
        }
    Je suis pas loin d'avoir compris mais j'ai deux questions

    Que signifie le typename T::monInt en argument de la première f ? Elle attend un nomInt ou c'est autre chose ?

    Ensuite, pourquoi ce script devrait-il planter sans SFINAE ? De par le concept de surcharge si un argument ne convient pas à une première déclaration de fonction, le compilateur appelle une autre fonction du même nom avec le bon type d'argument non ?

    Merci d'avance ! =)

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Réfléchis un peu

    Tu as 2 définitions de templates:
    1. Celle avec la méthode 1.
    2. Celle avec la méthode 2.


    La seule différence c'est le fait que pour la méthode 1, on attend une classe/ structure (/union ???)/ autre??? qu'il ait un attribut monInt. C'est le fameux T::monInt.
    Pour la méthode 2, c'est une définition "générique".

    C'est pour cela qu'avec f<Test>(10); le compilateur va prendre la méthode 1 (la structure Test a l'attribut monInt)

    Mais pour f<int>(10);, c'est différent. Le compilateur va appliquer la template méthode 1. Mais cela ne fonctionne pas.
    Et c'est là qu'intervient le SFINAE (*): Puisqu'il y a encore d'autres définitions à tester il ne produit pas d'erreur et passe à la suivante. C'est un "try and retry"


    * ->

Discussions similaires

  1. [1.x] Que signifie l'argument (Doctrine_Query $q = null)
    Par liryks_6 dans le forum Symfony
    Réponses: 1
    Dernier message: 07/12/2011, 01h14
  2. Que signifie la fonction ASSOCIATED ?
    Par sandra3434i dans le forum Fortran
    Réponses: 1
    Dernier message: 14/02/2008, 00h23
  3. que signifie "raw_" devant une fonction?
    Par raoulmania dans le forum MFC
    Réponses: 2
    Dernier message: 10/10/2005, 11h12
  4. Que signifier $0 et $@
    Par jaabouc dans le forum Linux
    Réponses: 6
    Dernier message: 01/06/2004, 15h17

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