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 :

Pointeur de fonction, Template, map et autres joyeusetés


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Pointeur de fonction, Template, map et autres joyeusetés
    Bonjour,

    Après avoir chercher et ne pas avoir trouvé de réponse qui convenais à ce que je veux faire (mais peut-être ai-je mal cherché).

    J'aimerai savoir comment réaliser la procedure suivante dont voici les données

    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
     
    typedef B (A::*FPTR_B)(X*)
    typedef C (A::*FPTR_C)(X*)
     
    class A {
        B evaluateB(X) { return *mapB[i](X) }
        C evaluateC(X) { return *mapC[i](X) }
     
        B PlusB(X) { return evaluateB(X->a) + evaluateB(X->b) }
        C PlusC(X) { return evaluateC(X->a) + evaluateC(X->b) }
     
        Map<String, FPTR_B> mapB = {("Plus", &PlusB), ... }
        Map<String, FPTR_C> mapC = {("Plus", &PlusC), ... }
     
    }
    avec B et C deux classes représentant très abstraitement la même chose (mais c'est pas exactement les même pour des raisons algorithmiques).

    J'aurais voulu pouvoir ecrire une seul fois la methode Plus afin de limiter les erreurs.

    Je sais que c'est un peu flou mais je n'ai pas encore l'autorisation de publier le code réel. La syntaxe est volontairement épurer donc evité de sortir des réponse idiotes tel que "Ca risque pas de compiler si tu écris ça". Je tiens à préciser que le code actuel fonctionne parfaitement.

    Merci.

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    C'est quoi exactement le problème ?

    Tu ne sais pas écrire des templates ? Tu ne sais pas quelle architecture suivre pour factoriser ton code ? Tu veux virer les pointeurs de fonction et passer à boost::function ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je pense que tu as trop simplifié donc on ne comprend plus ton problème.
    mapX sont des maps string - fonction ?
    Que devrait faire evaluateX(X) ? Appeler une des fonctions de la map précédente ?
    PlusB et PlusC prennent tous deux les mêmes paramètres ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    mapX sont des maps string - fonction ?
    Oui

    Citation Envoyé par 3DArchi Voir le message
    Que devrait faire evaluateX(X) ? Appeler une des fonctions de la map précédente ?
    Dans certains cas oui, sinon revoie une valeur. X est un arbre binaire d'expression.

    Citation Envoyé par 3DArchi Voir le message
    PlusB et PlusC prennent tous deux les mêmes paramètres ?
    Oui, le même arbre d'expression

    Le truc c'est que je n'arrive pas a faire un pointeur de fonction "templaté?".
    Ou alors savoir s'il existe une autre méthode pour factoriser.

    Exemple de ce qu'est X au début
    X -- "Plus" -- (T) 2
    +-- (T) 4

    sachant que T peut être soit B soit C.

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Le truc c'est que je n'arrive pas a faire un pointeur de fonction "templaté?".
    Montre nous ce que tu as fait

    Ou alors savoir s'il existe une autre méthode pour factoriser.
    Nan, ici les templates s'imposent d'elles même dans une classe intermédiaire?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ton problème reste trop épurée pour qu'on comprenne vraiment où tu bloques. Ne peux-tu faire un minimum compilable qui reproduise ton blocage ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Compilable, non, sinon je mets 500 lignes de code et des liens vers des composant externes

    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
     
    TInterval MathExpressionManager::evaluateT(ExpTree* tree) {
    	switch(tree->getType()) {
    	case CONSTANT  : return tree->node.getValue();
    	case FUNCTION  : return  (this->*functionsT[tree->node.getID()])(tree);
    	}
    }
     
    TFInterval MathExpressionManager::evaluateTF(ExpTree* tree) {
    	switch(tree->getType()) {
    	case CONSTANT  : return tree->node.getValue();
    	case FUNCTION  : return  (this->*functionsTF[tree->node.getID()])(tree);
    	}
    }
     
    FctMapT MathExpressionManager::initFctMap_() {
    	FctMapT f = FctMapT();
    	f["Plus"] = &MathExpressionManager::PlusT;
    	return f;
    }
     
    FctMapTF MathExpressionManager::initFctMap_() {
    	FctMapTF f = FctMapTF();
    	f["Plus"] = &MathExpressionManager::PlusTF;
    	return f;
    }
     
    TInterval MathExpressionManager::PlusT(ExpTree* t) {
    	return this->evaluate(t->left) + this->evaluate(t->right);
    }
     
    TFInterval MathExpressionManager::PlusTF(ExpTree* t) {
    	return this->evaluateTF(t->left) + this->evaluateTF(t->right);
    }
    Tree = {Node node, ExpTree* left, ExpTree* right}

Discussions similaires

  1. Pointeurs de fonction en map
    Par chumi dans le forum SL & STL
    Réponses: 12
    Dernier message: 13/01/2009, 11h48
  2. Réponses: 5
    Dernier message: 18/10/2006, 20h30
  3. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  4. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  5. Réponses: 13
    Dernier message: 03/10/2005, 18h06

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