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 :

Membre template dont le type dynamique n'est ni parametre ni valeur de retour.


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Membre template dont le type dynamique n'est ni parametre ni valeur de retour.
    Bonjoir.

    J'ai une petite question à laquelle je n'ai pas trouvé de réponse dans "Rechercher" ni sur un moteur de recherche.

    J'ai une template du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    void tfunc(void) {
        T tmp;
        tmp.member();
    }
    Je souhaiterai que des instantiations de cette template soient membres d'une de mes classes avec plusieurs types differents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class cl {
       public:
          void <cl2>func(void);
          void <cl3>func(void);
    };
    Cela ne semble pas fonctionner. Avez vous la solution ?
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne crois pas que tu puisses utiliser un template de fonction ainsi, même si elle a un paramètre de type T...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonsoir,

    À part ça, je ne vois pas :

    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
     
    class cl
    {
       public:
          void func_cl2(void);
          void func_cl3(void);
    };
     
    void cl::func_cl2(void)
    {
       tfunc<cl2>();
    }
     
    void cl::func_cl3(void)
    {
       tfunc<cl3>();
    }
    Mais pourquoi voudrais-tu faire une chose pareille, au juste ? Je pense que tu feras mieux de nous exposer ton problème un peu plus dans sa globalité.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour.
    Merci pour vos réponses.

    Alors plus de détails, en gros j'ai une dizaine de fonctions qui ont cette gueule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void f_t1(void)
    {
        if (dynamic_cast<t1>(foo)) {
            // Do something.
        }
    }
     
    void f_t2(void)
    {
        if (dynamic_cast<t2>(foo)) {
            // Do something.
        }
    }
    Etc. Et j'aimerais du coup une template de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class T>
    void f(void)
    {
        if (dynamic_cast<T>(foo)) {
            // Do something.
        }
    }
    Histoire de pas avoir à dupliquer mon code des tas de fois. Et je voudrais que toutes mes déclarations de template soient membres d'une classe.
    Voilou.

    Si quelqu'un a une idée...
    Merci.

  5. #5
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Ce « foo » en question, qu'est-ce que c'est au juste ? Une variable globale ?

    Et le traitement de chaque fonction, c'est le même ou pas ?

    Et pourquoi veux-tu absolument que ce template de fonction soit membre d'une classe ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Le foo est une classe interface choppée avec le getteur d'une classe singleton.

    Le traitement de chaque fonction est _exactement_ le même, je pourrais faire un define (d'ailleurs je sens que je vais le faire).

    Parce que c'est plus propre, là où je code on a pas de fonctions qui trainent dans le vide.



    Toutes ces questions ça veut dire que c'est pas possible en C++ et qu'on essaye de trouver une autre solution ?

  7. #7
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Je pose toutes ces questions parce que je te suspecte de vouloir mettre en place un mécanisme compliqué à base de templates alors que le problème pourrait peut-être être résolu simplement.

    Si le traitement est exactement le même, pourquoi ne pas faire dériver les classes t1 et t2 d'une interface commune et jouer avec le polymorphisme ?

    En quoi ce n'est pas propre d'avoir une fonction libre ?
    Je vois venir ta réponse. Le fait que Java l'interdise n'est absolument pas un argument !
    Utiliser un #define, ça par contre c'est sale. De même pour le dynamic_cast<>.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Je pose toutes ces questions parce que je te suspecte de vouloir mettre en place un mécanisme compliqué à base de templates alors que le problème pourrait peut-être être résolu simplement.
    Ben j'ai dix fois le même code, je voulais le factoriser. En C++ y'a les templates qui sont fait pour ça, je pensais que ça pourrait convenir.

    Citation Envoyé par Florian Goo Voir le message
    Si le traitement est exactement le même, pourquoi ne pas faire dériver les classes t1 et t2 d'une interface commune et jouer avec le polymorphisme ?
    C'est déjà assez lent comme ça. Enfin, là c'est toi qui vas chercher compliqué. J'ai le même code dupliqué avec juste un type qui change à chaque fois, c'est tricky de factoriser avec de l'héritage. Logiquement c'est de la template / macro que je veux.

    Citation Envoyé par Florian Goo Voir le message
    Utiliser un #define, ça par contre c'est sale. De même pour le dynamic_cast<>.
    Le define c'est sale mais ça marche. Le typage fort du C++ m'empêche de coder. Le dynamic_cast<> n'est pas un de mes choix (le C++ non plus), je ne peux pas faire sans.

    Citation Envoyé par Florian Goo Voir le message
    En quoi ce n'est pas propre d'avoir une fonction libre ?
    Je vois venir ta réponse. Le fait que Java l'interdise n'est absolument pas un argument !
    Chouette, un troll. Si on code en C++ c'est pour utiliser des classes et coder objet. Une fonction dans le vide c'est un problème conceptuel, c'est du code qui rentre pas dans le schéma objet du programme. Java force l'objet, c'est son problème, si y'avait que ça...
    Mais bon tu m'as attaqué du mauvais côté, Java est encore plus vomitif que le C++. Les langages objets sont lents, ils poussent les développeurs à la flemmardise.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par dev_null Voir le message
    Ben j'ai dix fois le même code, je voulais le factoriser. En C++ y'a les templates qui sont fait pour ça, je pensais que ça pourrait convenir.
    Les templates sont là pour ça, certes, mais avoir des templates pour à l'intérieur faire du dynamic_cast, on dirait bien qu'il y a quelque part une fonction virtuelle qui demande à s'exprimer.

    Citation Envoyé par dev_null Voir le message
    C'est déjà assez lent comme ça.
    Est-ce que tu réalises le coût d'un dynamic_cast par rapport à celui d'un appel virtuel ?
    Citation Envoyé par dev_null Voir le message
    Enfin, là c'est toi qui vas chercher compliqué.
    Je n'ai pas trop l'impression. Quel est le type de foo dans ton exemple ? Pour que le dynamic_cast ait une chance de marché, ça doit être un type relié à t1 et t2. Ajouter une fonction virtuelle dans ce type me semblerait une solution plus simple et plus robuste (le jour où tu ajoutes t3, rien à ajouter).
    Citation Envoyé par dev_null Voir le message
    Le define c'est sale mais ça marche. Le typage fort du C++ m'empêche de coder. Le dynamic_cast<> n'est pas un de mes choix (le C++ non plus), je ne peux pas faire sans.
    Comme Florian, je serais curieux de voir le vrai programme avec des vraies fonctions, parce que là, raisonner sur foo, bar, t1 t2, c'est un peu abstrait, mais j'ai bien l'impression que tu passes à côté de quelquechose.
    Citation Envoyé par dev_null Voir le message
    Chouette, un troll. Si on code en C++ c'est pour utiliser des classes et coder objet.
    Je ne répondrai pas au reste du troll, même si je ne vois pas en quoi une fonction libre violerait plus les principes objets qu'une fonction statique. Mais par contre, là, je connais des tas de gens qui utilisent le C++ pour ne pas faire d'objet. Le C++ est multiparadigme, il permet de l'orienté objet, du déclaratif, de la programmation générique, un embryon de fonctionnel... et c'est justement manipuler les différents paradigmes dans un même programme qui fait sa force.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Les templates sont là pour ça, certes, mais avoir des templates pour à l'intérieur faire du dynamic_cast, on dirait bien qu'il y a quelque part une fonction virtuelle qui demande à s'exprimer.

    Est-ce que tu réalises le coût d'un dynamic_cast par rapport à celui d'un appel virtuel ?
    Le dynamic_cast sert juste a checker si y'a moyen de hooker une fonction. C'est moche, sale, lent (comme le C++) mais j'en suis une victime (du dynamic_cast, pas du C++, quoique, les deux en fait).

    Citation Envoyé par JolyLoic Voir le message
    Je n'ai pas trop l'impression. Quel est le type de foo dans ton exemple ? Pour que le dynamic_cast ait une chance de marché, ça doit être un type relié à t1 et t2. Ajouter une fonction virtuelle dans ce type me semblerait une solution plus simple et plus robuste (le jour où tu ajoutes t3, rien à ajouter).
    Foo est une classe abstraite à laquelle je n'ai pas accès d'ailleurs.

    Citation Envoyé par JolyLoic Voir le message
    Comme Florian, je serais curieux de voir le vrai programme avec des vraies fonctions, parce que là, raisonner sur foo, bar, t1 t2, c'est un peu abstrait, mais j'ai bien l'impression que tu passes à côté de quelquechose.
    Le code que j'ai montré est celui qui nous intéresse, le reste n'a rien a voir là dedans.

    Citation Envoyé par JolyLoic Voir le message
    Je ne répondrai pas au reste du troll, même si je ne vois pas en quoi une fonction libre violerait plus les principes objets qu'une fonction statique. Mais par contre, là, je connais des tas de gens qui utilisent le C++ pour ne pas faire d'objet. Le C++ est multiparadigme, il permet de l'orienté objet, du déclaratif, de la programmation générique, un embryon de fonctionnel... et c'est justement manipuler les différents paradigmes dans un même programme qui fait sa force.
    Tu ne réponds pas au troll mais...
    C'est vrai qu'en C++ on peut faire aussi de l'ascii art, mais c'est pas à ça que ça sert. Coder en C++ sans objets... C'est du C qu'il faut faire dans ce cas. Le C est un vrai langage de programmation, il est juste au dessus du jeu d'instructions de ton processeur. Il n'y a pas de concept humain. Une classe, une virtuelle, il sait pas ce que c'est ton proco. Réfléchir en chien qui hérite d'animal c'est humain. Si tu codes un programme destiné à être lu par un humain, utilise du C++ si tu veux, c'est juste une question de goût. Mais à partir du moment où un programme doit être executé sur un ordinateur, il veut un programme en C.

    Edit : Je note également qu'aucun d'entre vous ne m'a clairement dit "C'est impossible", quelle mauvaise foi. Mais merci quand même pour votre aide.


    Sinon pour les gens qui auraient le même problème que moi et qui tomberaient sur ce topic, je pense le problème n'est pas solutionnable. J'ai cherché partout, j'ai même créé un compte sur developpez.net pour ça, mais pas moyen de trouver un truc.

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je n'ai pas dit que c'était impossible, parce que je n'ai pas compris ce que tu cherches à faire.

    Je souhaiterai que des instantiations de cette template soient membres d'une de mes classes avec plusieurs types differents.
    Cette phrase n'a pas vraiment de sens, du moins en C++. Ou alors, tu cherches simplement à avoir une fonction membre template ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
      template class<T> void f() {T toto; toto.g();}
    };
     
    A monA;
    monA.f<B>();
    Foo est une classe abstraite à laquelle je n'ai pas accès d'ailleurs.
    C'est peut-être le seul point de ton post où je peux commencer à être d'accord avec toi. S'il manque une fonctionnalité dans la classe de base, que celle-ci n'est pas modifiable, une solution à base de dynamic_cast peut aider. Une alternative préférable étant de faire dériver t1 et t2 d'une autre classe de base qui elle même hérite de Foo, voire en héritage multiple d'une classe qui elle fournisse la fonction membre virtuelle manquante. Mais pour ça, il faut avoir accès à t1 et t2. Si ce n'est pas non plus le cas, alors le dynamic_cast devient le seule solution qui marche.

    Sur les autres points, j'ajouterai qu'il m'arrive d'écrire des programmes non orientés objet en C++, et que je ne les écrirait en C pour rien au monde. J'ai en C++ un meilleur typage, des meilleures performances (comparer qsort et std::sort), et un meilleur niveau d'abstraction qu'en C (std::string/char*).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. affichage du contenu dont le type est TEXT + date
    Par stardeus dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/06/2007, 18h17
  2. Réponses: 3
    Dernier message: 23/04/2007, 15h53
  3. Réponses: 3
    Dernier message: 09/01/2007, 15h27
  4. Réponses: 10
    Dernier message: 27/04/2005, 11h26
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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