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 :

Peut-on passer une fonction en argument d'un template ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Peut-on passer une fonction en argument d'un template ?
    Je souhaiterais passer une fonction en paramétre d'un template, un peu comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template < class indrec, int (__cdecl *cmpf)(const indrec *,const indrec *) >
    class Seeker
    {
    	...
    public:
    	...
    	const char *Seek(long id)
    	{
    		...
    		return (const char *)bsearch(rec,records,reccount,recsize,cmpf);
    	}
    };
    Mais ça ne passe à l'instantiation.
    Est-ce autorisé, ou fais-je une erreur ?
    Merci !

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Merci, merci !
    J'ai très subtilement changé ton code comme ceci:
    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
    #include <iostream>
     
    struct Integer {
      int i;
    };
     
    int fois10 (const Integer *i, int (*cmpf)(const Integer *)) {
      return 10 * cmpf (i);
    }
     
    template <class T, int (*cmpf)(const T *)>
    class S {
    public:
      int s (const T *i) {
        return fois10 (i, cmpf);
      }
    };
     
    int __cdecl cmpf1 (const Integer *i) {
      return i->i;
    }
     
    int main () {
      S<Integer, cmpf1> s;
      Integer i = {10};
      std::cout << s.s(&i) << std::endl;
      return 0;
    }
    Et ça ne passe plus. Erreur à la ligne rouge
    : error C2440: 'specialization' : cannot convert from '' to 'int (__cdecl *)(struct Integer *)'
    None of the functions with this name in scope match the target type
    (VC6)

    EDIT: mais où donc est passé ta réponse ???

  3. #3
    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
    Oui je l'ai enlevé car je me suis aperçu que tu passais aussi class indrec en paramètre. Je revois donc ma copie mais ce sera pour plus tard. Je dois y aller.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Ah, OK, merci.

    J'ai changé comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template < class indrec >
    class Seeker
    {
    	...
    public:
    	...
    	const char *Seek(long id, int (__cdecl *cmpf)(const indrec *,const indrec *))
    	{
    		...
    		return (const char *)bsearch(rec,records,reccount,recsize,cmpf);
    	}
    };
    Et ça passe. Mais c'est moins élégant je trouve (et un peu gonflant de passer à chaque fois ma fonction en paramètre du seek).
    Donc si quelqu'un a mieux...

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu dois pouvoir faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template < class indrec >
    class Seeker
    {
    	...
    public:
    	...
            template< typename M >
    	const char *Seek(long id, M cmpf)
    	{
    		...
    		return (const char *)bsearch(rec,records,reccount,recsize,cmpf);
    	}
    };
    MAT.

  6. #6
    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
    En fait, il faudrait que la fonction bsearch soit une fonction template pour que ça passe. Oui ?

    Tu ne pourrais pas faire plus élégant en utilisant la STL et ses fonctions de recherche. Ce sera d'autant plus facile que la STL est écrit avec des templates.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Mat, merci. Mais je ne vois de différence "d'élégance" avec mon code, la fonction est toujours passée en paramètre de Seek().

    Aoyou, le bsearch() est là pour illustrer mon besoin. La réalité est bien plus complexe (fichiers, hash, etc).
    C'est sûr que dans les cas "simples" j'utilise souvent la STL (bien qu'on la connaisse toujours assez mal).

Discussions similaires

  1. Réponses: 15
    Dernier message: 23/01/2010, 11h04
  2. [JavaScript] [FAQ] Appeler dynamiquement une fonction et passer une fonction en argument
    Par SpaceFrog dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/05/2008, 14h48
  3. passer une fonction en argument, c'est possible ?
    Par kamouminator dans le forum C
    Réponses: 4
    Dernier message: 10/11/2006, 21h13
  4. Comment passer une fonction en argument
    Par Pades75 dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h34
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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