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 :

[std::function] fonction .target<Type>()


Sujet :

C++

  1. #1
    Membre régulier Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Points : 95
    Points
    95
    Par défaut [std::function] fonction .target<Type>()
    Bonjour,

    J'ai crée une fonction qui en génère une autre de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::function<double (const t_vector &)> get_fun(double c)
    {
       return [c](const t_vector & x) { return c*x; };
    }
    À partir de cela, je souhaiterais obtenir un pointeur sur fonction double (*ptr) (const t_vector &).

    Pour se faire, j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::function<double (const t_vector &)> f = get_fun(c);
     
    typedef double (*MyFun) (const t_vector &);
     
    MyFun * ptr = f.target<MyFun>();
     
    cout << (*ptr)(vec) << endl;
    Malheureusement, j'obtiens l'erreur : erreur de segmentation (core dumped).

    De toute évidence, les types ne doivent pas correspondrent...

    Help !

    En vous remerciant d'avance,

    Nicolas.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    L'erreur de segmentation vient du fait que f.target<MyFun>() renvoie un pointeur nul. Et c'est parce que dans ce cas le type sous-jacent à la std::function n'est pas un pointeur de fonction mais une fonction-objet. Ça aurait été un pointeur de fonction si la lambda ne capturait aucune variable.

    Cela s'explique par le fait que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [](const t_vector &)->double{/*...*/}
    Peut être implémenté par le compilateur comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double foo(const t_vector &){/*...*/}
    Le standard nous autorise donc à prendre un pointeur de fonction sur une lambda sans capture.
    Alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [c](const t_vector &)->double{return c*x;}
    Ne peut pas être implémenté comme une fonction, mais sera une sorte de fonction-objet par exemple comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct foo
    {
       double c;
       foo(double c):c(c){}
       void operator()(const t_vector &){return c*x;}
    };

  3. #3
    Membre régulier Avatar de Nadd
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 160
    Points : 95
    Points
    95
    Par défaut
    D'accord!

    Malheureusement, je suis obligé de capturer ces variables.

    Toutefois, il n'y a a priori rien de contraignant à travailler avec un objet de type std::function.

    Merci beaucoup!

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

Discussions similaires

  1. [C++11] std::function, fonctions membres et héritage
    Par Assouan dans le forum Langage
    Réponses: 9
    Dernier message: 05/03/2013, 19h53
  2. fonction renvoi de type personnalisé
    Par Averroes dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/09/2007, 12h33
  3. [SQL] Supprimer une ligne en fonction d'un type de champs
    Par Aspic dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 10/07/2007, 17h28
  4. Réponses: 10
    Dernier message: 18/05/2006, 17h18
  5. Réponses: 14
    Dernier message: 02/03/2005, 19h15

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