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 :

Callback en C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 39
    Par défaut Callback en C++
    Bonjour,

    J'ai une petite question pour vous : comment on fait en C++ pour faire des callback ? J'ai vu ce lien tout a l'heure : https://www.developpez.net/forums/bl...-cpp-deprecie/ mais l'auteur précise que c'est déprécié, donc actuellement quels sont les moyens pour faire un callback ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Déprécié mais toujours fonctionnel.
    Et puis simplement avec la virtualité aussi.
    Sinon std::function.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 39
    Par défaut
    Merci Bousk pour ta réponse, std::function semble correspondre à mes besoins en parti du moins. En fait, dans l'exemple que donne cppreference, on connaît le nom de la fonction (je comprends donc pas alors l'utilité de ne pas l'appeler directement pour le coup).

    Moi dans mon besoin, j'aurais besoin de ne pas connaître à l'avance la méthode ou fonction à appeler. En fait je t'explique, dans ma folie d'apprentissage, je voudrais concevoir un moteur de jeu basé sur la SFML, avec des systèmes afin de rendre plus facile l'utilisation de la SFML comme par exemple ne pas devoir créer la boucle sf::Event par exemple, c'est le moteur qui gèrerait ça et pour ajouter les événements justement, il n'y aurait qu'un "add" à faire et lui passer en paramètre le nom de la fonction (ou de la méthode) à utiliser, afin que la méthode "add" puisse justement faire appel à ce fameux callback, un peu comme je le ferais en PHP ou JavaScript.

    Là pour std::function, on passe pas le nom de la méthode comme étant une chaîne de caractère mais directement son nom normal, comme si on l'appelait directement ce qui au final n'a pas grand intérêt je trouve. Moi j'ai besoin de pouvoir comme en PHP passer en paramètre à la dite fonction/méthode (en chaîne de caractère) le nom de la méthode à appeler.

    En clair, je cherche un équivalent au call_user_func_array de PHP ou pouvoir faire comme en PHP, c'est à dire pouvoir utiliser le contenu d'une variable comme si c'était le nom de la méthode à appeler. Genre en PHP tu as une variable $class par exemple, tu peux faire : $object = new $$class() pour instancier l'objet et : $object->$$method() pour appeler la méthode (dans mon exemple les deux ont été fournis en paramètre donc variable $class et variable $method).


    L'avantage ici, c'est qu'on connaît réellement pas le nom de ce qu'on doit appeler, et soit avec le call_user_func_array (mais il fait pas l'instanciation de la classe, donc je recommande moyen l'usage de cette fonction PHP si on a pas déjà créer une instance de la classe) dont les paramètres vont être la classe et la méthode, soit faire l'instanciation et l'appel directement depuis des variables ; dans tout les cas, on a des inconnues qui sont remplies par des chaînes de caractères.


    J'espère que mon explication est assez claire.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par christophedlr Voir le message
    En fait, dans l'exemple que donne cppreference, on connaît le nom de la fonction (je comprends donc pas alors l'utilité de ne pas l'appeler directement pour le coup).
    Faut aller plus loin que le premier exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::function<void()> f_display_42 = []() { std::cout<<42<<std::endl; };
        f_display_42();
    Où tu vois une fonction connue ici ?

    Oublie PHP, tu fais du C++.
    Appeler une fonction d'après son nom, c'est plus du scripting. C'est possible, mais loin d'être facile. Donc oublie cette voie.
    Ce que tu veux c'est std::function, ou une interface à hériter.

    Après si tu ne sais pas faire ça ou ne comprends pas ces simples choses, c'est que c'est au-delà de tes compétences actuelles.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour,

    Citation Envoyé par christophedlr Voir le message
    Moi j'ai besoin de pouvoir comme en PHP passer en paramètre à la dite fonction/méthode (en chaîne de caractère) le nom de la méthode à appeler.
    Ça, ce n'est pas vraiment un besoin. C'est plutôt un moyen parmi d'autres qui t'es venu à l'esprit pour répondre à ce besoin.

    À la place, ce que tu peux faire, c'est encapsuler dans ton évènement un std::function<void()>.
    Si tu as un objet foo qui a une méthode bar, alors tu peux créer un std::function<void()> qui exécutera foo.bar(). En effet, on fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::function<void()> fn = [&]() { foo.bar(); };
    Attention, dans mon exemple, le lambda capture foo par référence, donc il faut faire attention à ce que foo existe toujours quand on a envie d'appeler fn().

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 39
    Par défaut
    Merci pour ta réponse Pyramidev, je testerai ça dès que j'ai le temps (hélas peut en ce moment :'().

  7. #7
    Membre très actif
    Avatar de smarlytomtom
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2014
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 139
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par christophedlr Voir le message
    Bonjour,

    J'ai une petite question pour vous : comment on fait en C++ pour faire des callback ? J'ai vu ce lien tout a l'heure : https://www.developpez.net/forums/bl...-cpp-deprecie/ mais l'auteur précise que c'est déprécié, donc actuellement quels sont les moyens pour faire un callback ?
    Bonjour Christophe !

    J'ai passé mon billet en déprécié une fois que le standard std::function est apparu ! La méthode décrite dans le billet est utilisé en C, et l'est également en C++. En effet elle est toujours fonctionnelle mais il faut mieux suivre les standard ! Surtout que ce standard est suivi de l'apparition des fonction lambda.

    Si tu as d'autres questions n'hésites pas !

    NB : J'ai mit à jour le titre du billet pour préciser qu'elle est toujours fonctionnelle et éviter les confusions.

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

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  3. Callback
    Par el_diablos dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2004, 08h48
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04

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