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 :

[C++] Créer une fonction template avec argument


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [C++] Créer une fonction template avec argument
    Bonsoir,

    J'ai défini des classes qui possèdent toute une méthode afficher(param p).

    Etant donné que j'utilise des std::vector, j'ai eu l'idée de créer une fonction template pour appeller la fonction afficher(param p) quelque soit la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct Afficher
    {
        /*Afficher(const BITMAP*& zoneJeu) zoneJeu(zoneJeu) {}*/
       template <class T> void operator ()(T*& p, BITMAP* zoneJeu) const
       {
          p->afficher(zoneJeu);
       }
    /*
       private:
        BITMAP* zoneJeu;*/
    };
    Et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for_each(tabVector.begin(), tabVector.end(), Afficher(zoneJeu));
    Message d'eereur :
    no matching function for call to `Afficher::Afficher(BITMAP*&)'|
    Ca ne fonctionne pas, j'ai testé des variantes en commentaire.

    Le but est de remplacer des fonctions du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (unsigned int i=0; i<tab1.size(); i++)
        {
            tab1[i]->afficher(zoneJeu);
        }
    for (unsigned int i=0; i<tab2.size(); i++)
        {
            tab2[i]->afficher(zoneJeu);
        }
    Voilà merci et bonne soirée
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    la_tupac
    Invité(e)
    Par défaut
    Salut, il me semble ce que tu essaye de faire c'est un overload du constructeur, non? Je ne suis pas un pro mais je crois aussi qu'il est impossible de procéder ainsi.
    Je peux me tromper mais le p->afficher() n'aura pas la même valeur en tant que pointeur de fonction si la class est diférente.
    Perso j'utilise dynamic_cast avec diférents types et si le retour est non null je place l'appel à p->afficher(). C'est surement un peu lourd mais ça fonctionne .

  3. #3
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    tupac, non, encore heureux qu'on puisse surcharger le ctor ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct Afficher
    {
        Afficher(const BITMAP*& zoneJeu) : zoneJeu(zoneJeu) {}
       template <class T> void operator ()(T*& p, BITMAP* zoneJeu) const
       {
          p->afficher(zoneJeu);
       }
     
       private:
        BITMAP* zoneJeu;
    };
    devrait fonctionner. Je pense que tu avais oublier le : dans la liste d'initialiation.

    Donnes quand meme le code de afficher et des classes stockées dans ton vector.

  4. #4
    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 Joel F Voir le message
    tupac, non, encore heureux qu'on puisse surcharger le ctor ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct Afficher
    {
        Afficher(const BITMAP*& zoneJeu) : zoneJeu(zoneJeu) {}
       template <class T> void operator ()(T*& p, BITMAP* zoneJeu) const
       {
          p->afficher(zoneJeu);
       }
     
       private:
        BITMAP* zoneJeu;
    };
    devrait fonctionner. Je pense que tu avais oublier le : dans la liste d'initialiation.

    Donnes quand meme le code de afficher et des classes stockées dans ton vector.
    Pourquoi est-ce que l'operator() prends deux arguments ? for_each() appelle le functor avec un seul argument, donc ça ne pourra pas marcher.

    Ensuite, passer une référence sur un pointeur, ce n'est pas utile - d'autant que le pointeur n'est pas modifié dans la fonction.
    [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.

  5. #5
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    effectivement, j'ai juste corrigée l'erreur sur le liste d'init. Ca m'apprendra a posté a 7h14 :E

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct Afficher
    {
        Afficher(const BITMAP*& zoneJeu) : zoneJeu(zoneJeu) {}
       template <class T> void operator ()(T const& p) const
       {
          p.afficher(zoneJeu);
       }
     
       private:
        BITMAP* zoneJeu;
    };

  6. #6
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Exact ca marche

    J'avais vu l'erreur dans le foncteur ce matin mais j'ai oublié de posté la solution

    Cependant juste une question : Quel est l'intérêt d'utiliser des foncteurs plutôt que d'utiliser des for ? Est ce que c'est plus performant ?

    Merci !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Surchargé une fonction template avec template
    Par SKone dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2014, 20h00
  2. [E-00][VBA] Créer une fonction et ses arguments
    Par tiyolx dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/07/2013, 09h43
  3. Créer une fonction SQL avec variable
    Par theuma dans le forum Access
    Réponses: 6
    Dernier message: 18/04/2011, 12h02
  4. Réponses: 9
    Dernier message: 24/03/2011, 21h54
  5. Réponses: 3
    Dernier message: 13/04/2010, 16h13

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