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 :

Templates - instance passée en paramètre


Sujet :

C++

  1. #1
    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 Templates - instance passée en paramètre
    Bonjour à tous,

    Hé bien tout d'abord je voudrais savoir, y a-t-il une raison de ne pas utiliser les templates de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A { public : void truc(); /* ... */ }
    template <A a> void f() { a.truc(); }
    // ...
    A a;
    f<a>();
    Ensuite, si cette utilisation ne pose pas de problèmes, je suppose qu'on peut "templatiser" le type du paramètre...
    dans le genre de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template < template <class T> T t> void f() { }
    mais cette syntaxe ne compile pas.
    Merci de votre temps.

  2. #2
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Par défaut
    A priori ce code semble bizarre... et peu recommandé même s'il marchait : le compilateur génère une fonction pour chaque valeur "templatizée" utilisée. Imagine ce que ca donne si tu as des milliers ou millions d'instances ! Il vaut bien mieux utiliser des paramètres de fonctions tout simples.

  3. #3
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Il y a une raison pour qu'on ne puisse pas faire cela : c'est que ce qui est templatisé doit être connu au moment de la compilation. Lorsque tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <A a> void f() { a.truc(); }
    tu passes une variable comme paramètre template, ce qui n'est pas acceptable par le compilateur.

    Je ne comprends pas bien ce que tu cherches à faire avec ce code, mais peut-être est-ce la spécialisation des templates qui t'intéresse ?
    http://c.developpez.com/faq/cpp/?pag...specialisation

  4. #4
    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
    Pas forcément, justement.
    J'voulais juste voir jusqu'ou on pouvait aller.
    Mais avec les templates, imaginons un tableau de taille N, dans une class template, ou l'on précise l'entier N à la compilation.
    Ce code compilerait (non?) pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int n;
    cin >> n;
    Maclass<n> m;
    Ce qui ne diffère pas fondamentalement du premier code que j'ai mis.
    Enfin de toute manière je peux retrouver un comportement semblable à celui que j'ai voulu sans trop de problèmes il me semble.en passant par une structure intermédiaire pour "templatiser" le type, mais bon, rares seront les cas ou j'aurais besoin de passer l'instance en paramètre, car c'est un peu absurde
    Autant faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class T> void f(T t)

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ce code ne compile pas car n n'est pas constant et non connu à la compilation.

  6. #6
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Ce code compilerait (non?) pourtant :
    Code :
    int n;cin >> n;Maclass<n> m;
    Non. n doit être déterminé à la compilation. Un template est instancié statiquement, et le compilateur doit avoir toutes les infos nécessaires pour compiler. S'il compile, tu risque d'avoir un problème...
    Notons qu'un paramètre de template ne peut être utilisé en tant que variable comme ici :
    Code :
    template <A a> void f() { a.truc(); }
    et cela est fort heureux, car un paramètre de template est un paramètre de TYPE (en général, d'où le mot clé typename). Notons qu'il peut s'agir aussi d'une constante. Quoi qu'il en soit, ce paramètre doit être connu à la compilation.

  7. #7
    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
    Je sais bien. Je voulais simplement tester les limites.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Bonjour,

    Je sais que le problème est résolu mais comme personne n'avait répondu à la question suivante :

    Ensuite, si cette utilisation ne pose pas de problèmes, je suppose qu'on peut "templatiser" le type du paramètre...
    dans le genre de :

    Code :
    template < template <class T> T t> void f() { }
    Tu ne chercherais pas à mettre un paramètre template en tant que paramètre de ton template ? Dans ce cas, de souvenirs, il faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template < class T, template <class T> U > void f() {...}
    La classe T paramètre de ta classe template U doit être connu à la compilation. Tu es donc obligé d'avoir deux paramètres pour ton template mais ce n'est peut-être pas ce que tu veux. Je faisais ça pour des classes templates.

    ++

  9. #9
    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
    Pour la double "templatization", c'est bien de ça que je parlais...
    Il me semblait avoir lu cette syntaxe.
    Quand à l'instance, c'était juste un test.
    Merci!

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour prendre en paramètre template un template, il suffit de ne pas oublier que ses paramètres templates font partie de son type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Classe template quelconque
    template <class T, int I, bool B>
    class Bidule {};
     
    // Classe pouvant recevoir un Bidule en paramètre template
    template <template <class, int, bool> class A>
    class Truc {};
     
    // On pourra écrire :
    Truc<Bidule> Obj;

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2006, 21h31
  2. Problème de fstream passé en paramètre
    Par Beb8 dans le forum SL & STL
    Réponses: 2
    Dernier message: 11/04/2005, 11h51
  3. [SQL server 2000] bout de requete passé en paramètre
    Par guignol dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/08/2004, 17h45
  4. Réponses: 6
    Dernier message: 28/05/2004, 09h39
  5. Réponses: 5
    Dernier message: 27/11/2003, 10h55

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