std::function

Stocker une fonction

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjours,

Je cherche à stocker des fonctions, j'utilise pour ça std::function :

 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
#include <functional>
#include <iostream>

class Choix
{
    public:
        std::function<void()> callback;
};


void maFonction()
{
    //Fait un truc
}

int main()
{


    Choix c;

    //Attribution
    c.callback = [&] {maFonction(); };

    //Appel à la fonction
    c.callback();

    return 0;
}

C'est le cas basique. Disons maintenant que je veuille stocker plusieurs fonctions, mais avec des prototypes différents (une prends en paramètre un int, l'autre rien). Comment je dois procéder ? Est-ce possible ?

Merci

+0 -0
Auteur du sujet

Peut être avec un std::tuple non ?

LudoBike

Tu as plus de précision à ce sujet ?

C'est possible en les mettant dans deux conteneurs différents :)

epso

Le but serait justement de ne pas faire un conteneur par fonction possible.

+0 -0

Cette réponse a aidé l'auteur du sujet

Si tu veux les mettre toutes dans le même conteneur, tu fais comment après pour savoir ce qu'il faut lui passer comme paramètre quand tu veux invoquer la fonction?

Dans l'absolu on peut toujours faire du type-erasure pour les stocker, mais vu que tu as besoin de l'info à l'utilisation, ça semble peu adapté…

Édité par epso

+4 -0
Auteur du sujet

Si tu veux les mettre toutes dans le même conteneur, tu fais comment après pour savoir ce qu'il faut lui passer comme paramètre quand tu veux invoquer la fonction?

Dans l'absolu on peut toujours faire du type-erasure pour les stocker, mais vu que tu as besoin de l'info à l'utilisation, ça semble peu adapté…

epso

Je pensais faire une sorte de map, qui contient une clé qui me permettrait de savoir cela.

+0 -0

Cette réponse a aidé l'auteur du sujet

Lu'!

Comme le fait remarquer @epso, cela demande une instrumentation supplémentaire et de passer par du type-erasure.

Personnellement, je ne suis pas convaincu que tu aies besoin de ça. Donc la question : c'est quoi ton problème concret ?

First : Always RTFM - "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein

+5 -0

Hey !

D'après l’exemple que tu nous donne tu peut opérer de 2 façons :

  • std::function : consomme bcp de performance

  • pointer function (soit en manuel, soit en template) : te permet de stocker et d'utiliser des fonctions en pointer et cela en haute performance ;)

Concernant ta question, il y a 2 possibilités de manager :

  • Soit tes fonctions acceptent seulement des paramètres, donc elle sont toutes void.

  • Soit elles peuvent renvoyer une valeur et possèdes différents paramètres

Je te propose de regarder ce code destiné aux ThreadPool qui pourra certainement t'aider : github.com/progschj/ThreadPool

Cplusplusment, Christophe

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte