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 :

template & passage de fonction en argument


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut template & passage de fonction en argument
    Bonjour,

    je viens de découvrir les templates et qu'on passer des fonctions en argument d'une fonction, mais je ne comprends pas encore bien comment cela fonctionne. Le mieux est que je montre ce que je cherche à faire :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    // fonction.h
     
    template <typename T> void zone_brillouin(const int & P, T * in)
    {
            for(int i = 0; i<P; i++)
            {
    		vector q=i;
    		in(q);
    	}
    }
     
    void Chi_c(const complex & iomega, const vector & q);
    void Chi_0(const vector & q);
     
    // fonction.cpp
     
    void Chi_c(const complex & iomega, const vector & q)
    {
     
    }
     
     
    void Chi_0(const vector & q)
    {
     
    }
     
    // main.cpp
     
    using namespace std;
    #include "fonction.h"
    #include "complex.h"
    #include "vector.h"
     
    int main()
    {
    complex C(0,1);
    zone_brillouin(50,&Chi_0); // Fonctionne bien
    zone_brillouin(50,&Chi_c); // Comment je peux définir les paramètres de gauches ?
    return 0;
    }
    À la compilation, j'ai ce type de message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ make -j 5
    In file included from fonctions.cpp:7:
    fonctions.h: In function ‘void zone_brillouin(const int&, T*) [with T = void(electron, const int&, const complex&, const vector&)]’:
    fonctions.cpp:183:   instantiated from here
    fonctions.h:35: error: conversion from ‘vector’ to non-scalar type ‘electron’ requested
    fonctions.h:47: error: conversion from ‘vector’ to non-scalar type ‘electron’ requested
    fonctions.h:63: error: conversion from ‘vector’ to non-scalar type ‘electron’ requested
    fonctions.h:75: error: conversion from ‘vector’ to non-scalar type ‘electron’ requested
    make: *** [fonctions.o] Erreur 1
    $
    (dans mon "vrai" programme, le premier argument de Chi_c est un electron)

    J'ai environ 50 fonctions différentes que je vais passer en arguments à zone_brillouin, toutes avec un nombre différent d'arguments, où il faudrait que dans zone_brillouin, la fonction in agisse comme une fonction à une variable de type tector, les autres étant fixées dans le main.

    Est ce que je suis clair ?
    Si oui, cela est-il possible ?

    Merci d'avance pou vos réponses.

  2. #2
    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
    vector est une classe template, il faut l'instancier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <typename T> void zone_brillouin(const int & P, T * in)
    {
            for(int i = 0; i<P; i++)
            {
    		vector<T> q=i;
    		in(q);
    	}
    }
    et ce partout

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Dans mon cas, j'utilise ma propre classe vecteur qui ne contient pas de template.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Par défaut
    En utilisant les templates variadiques(c++1x only):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <typename T, typename... V> void zone_brillouin(T in, int p, const V&... args)
    {
            for(int i = 0; i<p; i++)
            {
    		vector q=i;
    		in(q, args);
    	}
    }
    pas sur de la syntaxe, si tu n'a pas les templates variadiques tu a toujours les macros variadiques ou au pire tu surcharges zone_brillouin. par contre il faut que tes autres paramètres soient à droite et non à gauche

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Il semble que ce soit exactement ce que je cherche.
    J'ai ajouté -std=gnu++0x dans mon makefile.
    Pour la syntaxe,c'est la bonne à un détail près : in(q, args...);

    Mais à la compilation, j'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonctions.cpp: In function ‘void Chi_c_right(electron, const int&, const int&, const complex&)’:
    fonctions.cpp:182: error: no matching function for call to ‘zone_brillouin(<unresolved overloaded function type>, const int&, electron&, const int&, const complex&)’
    make: *** [fonctions.o] Erreur 1
    Edit : L'erreur venait juste du header où je n'avais pas changé l'ordre des variables.
    Ça fonctionne très bien, c'est vraiment très puissant ces templates variadiques. Merci beaucoup ! J'espère que ça va compiler sur le cluster de mon labo (144 processeurs).

Discussions similaires

  1. Passage de fonction en argument à une autre classe
    Par alalalola dans le forum Langage
    Réponses: 8
    Dernier message: 01/05/2011, 14h42
  2. Passage de fonction en argument
    Par Loïc B. dans le forum Fortran
    Réponses: 6
    Dernier message: 12/09/2008, 11h09
  3. Réponses: 2
    Dernier message: 02/09/2008, 11h37
  4. Passage de conteneur en argument de fonction
    Par elnino67 dans le forum SL & STL
    Réponses: 4
    Dernier message: 28/05/2008, 19h13
  5. Réponses: 11
    Dernier message: 04/10/2007, 17h18

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