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 :

Déduction template mystérieuse


Sujet :

Langage C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Déduction template mystérieuse
    Hello,

    Ne lire la suite que si vous souhaitez mettre au défi votre sagacité concernant les templates.

    Je suis en train d'étudier Boost::Interprocess, notamment managed_shared_memory dans interprocess_fwd.hpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <class CharType
             ,class MemoryAlgorithm
             ,template<class IndexConfig> class IndexType>
    class basic_managed_shared_memory;
     
    typedef basic_managed_shared_memory
       <char
       ,rbtree_best_fit<mutex_family>
       ,iset_index>
    managed_shared_memory;
    Le dernier argument template, iset_index, est un type a priori incomplet, puisqu'il est lui-même un argument template template, et qu'on ne donne pas son argument template.
    Toutefois, la valeur de cet argument template semble déduite, puisqu'on peut instancier managed_shared_memory. Mais après avoir fouillé, je n'arrive pas à trouver comment.

    Si vous avez le sens du défi, je vous propose de relever le gant (il est évident que ce que je fournis ici ne permet pas d'avoir la solution ; il faut aller dans les sources de Boost 1.52.0).

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bon, après avoir gratté un peu plus, j'ai fini par trouver.
    Ça se passe dans la classe segment_manager, pour ceux que ça intéresse.

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonsoir,

    Je ne comprends pas trop ta question. Les paramètres templates n'ont pas besoin d'être définies pour permettre l'instanciation. La définition n'est utile que si tu en as besoin dans ton template. Par exemple ceci compile :
    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
    template<template<class> class>
    struct A;
     
    template<class>
    struct B;
     
    typedef A<B> C;
     
    template<template<class> class T>
    struct A
    { 
        void foo()
        { T<char>().foo(); }
    };
     
    template<class>
    struct B
    { void foo(){} };
     
    int main()
    { C c; c.foo(); }
    C'est une histoire de point d'instanciation (POI). Les template sont instanciés au plus proche de l'utilisation (c'est en partie dépendant de l'implémentation du compilo). Ici c'est C c; qui demande l'instanciation de la classe (qui ne requière pas la définition de B, je te laisse tester), et l'appel à foo l'instanciation de la fonction membre (et donc la définition de B). Le typedef ne fait rien.

    Edit: iset_index n'est pas un type, c'est une classe template.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Je ne comprends pas trop ta question. Les paramètres templates n'ont pas besoin d'être définies pour permettre l'instanciation. La définition n'est utile que si tu en as besoin dans ton template.
    Effectivement.
    Mais dans l'exemple que tu présentes, le template de B est anonyme, et n'est pas utilisé. J'étais quant à moi parti du postulat que le fameux paramètre template avait sa raison d'être, et que le type avait donc besoin d'être renseigné. D'où mon insistance à aller fouiller dans le code.

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    J'utilise bien le paramètre template dans la fonction foo pourtant (et j'aurais même pu le mettre en attribut dans la classe). Mon code était là pour te montrer que le typedef se moque de savoir ce qui est définie ou non. Tant que ca existe c'est bon. C'est au moment où tu l'utilises (donc dans le cas de boost ca va probablement se retrouver dans ton main), que les définitions sont nécessaire.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 02/12/2010, 11h36
  2. Réponses: 2
    Dernier message: 17/10/2010, 15h11
  3. déduction implicite d'argument template
    Par camboui dans le forum C++
    Réponses: 12
    Dernier message: 13/06/2010, 20h41
  4. surcharge et déduction template
    Par gb_68 dans le forum Langage
    Réponses: 2
    Dernier message: 13/01/2010, 19h36
  5. Problème déduction paramètre template
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 29/01/2008, 13h27

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