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 :

Stockage foncteur (encapsulation de fonctions)


Sujet :

C++

  1. #21
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pour les fonctions membres, on peut bricoler ça très rapidement... il suffit juste comme tu l'as dit de prendre en compte la classe... Au pire tu peux ajouter une couche d'abstraction entre la fonction et la classe qui représente les fonctions par le biais d'une classe de traits et/ou politique à qui on délèguerait la gestion des appels de fonction.

  2. #22
    Membre averti
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Par défaut
    Justement, lors de l'appel de la fonction, on ne connait pas la classe (s'il y en a une) à laquelle est associée la fonction puisque que ce sera une classe propre à l'utilisateur.
    Comment veux-tu faire cette couche d'abstraction ? je n'ai pas bien compris. Une classe de politique ajouterait un paramètre template supplémentaire, comment le déduire ?

  3. #23
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Tu auras besoin de spécialiser, selon s'il s'agit d'une fonction membre ou non.

  4. #24
    Membre averti
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Par défaut
    Désolé, je ne vois pas comment faire

    Par exemple, on a 'bindé' une fonction membre que l'on a stocker sous forme de ifunction_base*. Même si on spécialise ifunction_base pour les fonctions membres, il faudra de toute manière s'abstraire du type de la classe et ensuite la spécifier lors de l'appel à operator (). Même avec une classe de politique, il faudra quand même stocker, sous forme de paramètre template, le type de la classe quelque part.

    Enfin, je sèche

  5. #25
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Si ce qui est recherché c'est un genre de boost::function mais sans devoir forcer la signature, c'est parfaitement possible, mais uniquement avec un ensemble fini de possibilités. (un ensemble non fini requierait des fonctions templates virtuelles)
    Il devrait être assez aisé d'enregistrer certains types de base et de générer toutes les possibilités jusqu'à une certaine arité n.

  6. #26
    Membre averti
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Par défaut
    C'est bon, j'ai trouvé la solution !!!

    Je fais hériter les foncteurs de fonctions membres des foncteurs de fonctions libres ayant la même signature :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Pour les fonctions membres ayant comme signature void ()
    template <class R, class C>
    struct Function<R (C::*)()> : public Function<R()> { ... };
    Ensuite j'ai mis l'opérateur () en virtual. Donc, lorsqu'on fais un dynamic_cast, il suffit juste de connaître la signature de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // ce code marche pour les fonctions membres et libres :
    template <class R> R Functor::operator()()
    {
        Function<R()>* self = dynamic_cast<Function<R()>*>(this);
        assert(self != 0); return self->operator()();
    }
    // Les foncteurs de fonctions libres héritent de Functor.

    J'espère que vous avez compris, j'ai jamais été doué pour expliquer .

    Je vous met le code complet en pièce jointe si ça vous intéresse.

    Merci à tous pour votre aide
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Encapsuler des fonctions
    Par StryceK dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/02/2014, 16h15
  2. [XL-2007] Macro stockage de données en fonction de 3 critères
    Par Jacques33 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/03/2012, 12h12
  3. [SHELL] - Encapsuler les fonctions de copie
    Par Mika2008 dans le forum Linux
    Réponses: 11
    Dernier message: 26/09/2010, 11h36
  4. Encapsulation des fonctions en javascript
    Par nicko_73 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/10/2009, 10h29
  5. Réponses: 4
    Dernier message: 30/09/2008, 19h13

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