std::function

Stocker une fonction

Le problème exposé dans ce sujet a été résolu.

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

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é…

+4 -0

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.

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

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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