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 de fonctions


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Stockage de fonctions
    Salut à tous,

    Alors c'est dans le contexte d'un langage de script.

    Je souhaiterais pouvoir associer(surement dans une map) à chaque chaine la fonction qui lui correspond :
    "f(a,b)" => f(a,b)

    Seulement, en templatant etc, je me retrouve quand même face à un problème : comment pouvoir avec _un type_ pouvoir représenter toutes les fonctions ?
    Soit FuncType ce type, je ferais alors un :
    std::map < std::string , FuncType > ma_map;

    Ensuite je la remplirai ce n'est pas un problème. Mais comment designer le tout pour obtenir un FuncType ?

    Merci

  2. #2
    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
    Il faut distinguer selon les paramètres de la fonction

  3. #3
    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
    Et pour le type de retour?

    En gros, tu concevrais ça comment?

    A la limite, faire une map pour les fonctions sans arguments, une pour celles à 1 argument, une pour celles à 2 arguments, etc, ça peut être faisable.

    Dans ce cas là tu ferais comment ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    boost::function pour stocker les fonctions (function<void ()>, function<void (int)>, function<void (int, int)>, ... par exemple) avec boost::bind pour les créer comme il faut.

  5. #5
    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
    Hmm, j'y ai pensé.
    Mais ça marchera pas si je mets des boost::function0<...> boost::function1<...> etc ..., non ?
    Puisqu'il faudrait un seul type, pour définir ma map.

    EDIT : j'ai rien dit, j'avais oublié qu'en fait on a la possibilité d'utiliser les deux : boost::function< > et boost::functionN< > . Désolé.

  6. #6
    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
    Ah loufoque, en effet j'étais pas allé aussi loin dans mon raisonnement.
    Je pense que ça devrait faire l'affaire.
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<typename R> R operator()()
    {
            return f_();
    }
    Ca marche ça? Il me semblait que non. Que le compilo ne déduisait pas R tout seul.

  7. #7
    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
    Hmm en fait tu peux peut-être faire un wrapper universel...
    Un truc du style

    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
    struct ifunction_base
    {
        template<typename R> virtual operator()();
        template<typename R, typename V1> virtual operator()(const V1&);
        template<typename R, typename V1, typename V2> virtual operator()(const V1&, const V2&);
    };
     
    template<typename R> class ifunction : public ifunction_base
    {
        boost::function<R> f_;
     
    public:
        ifunction(const boost::function<R>& f) : f_(f)
        {
        }
     
        R operator()()
        {
             return f_();
        }
    };
     
    class Function
    {
       ifunction_base* f_;
     
    public:
       template<typename R> Function(const boost::function<R>& f) : f_(new ifunction<R>(f));
       {
       }
     
       template<typename R> R operator()()
       {
            return f_();
       }
     
       ~Function()
       {
            delete f_;
       }
    };

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

Discussions similaires

  1. stockage des fonctions javascript
    Par dabac dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/03/2011, 17h38
  2. [Fonctions]Prix de stockage différents.
    Par UiYuki dans le forum Débuter
    Réponses: 8
    Dernier message: 20/10/2008, 09h49
  3. Réponses: 4
    Dernier message: 30/09/2008, 18h13
  4. Stockage foncteur (encapsulation de fonctions)
    Par xwindoo dans le forum C++
    Réponses: 25
    Dernier message: 11/07/2008, 16h21
  5. Réponses: 1
    Dernier message: 30/08/2006, 20h54

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