Passer une fonction en paramètre
Bonjour à vous !
Suite à ce post et à l'aide de celui-ci, j'ai souhaité améliorer la simplicité d'ajout de nouvelles "pages" à mon programme.
Page.h
Code:
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
| #include <vector>
#include <string>
#include <functional>
#include "Model.h"
class Page
{
//Définit le type à stocker
enum CallType
{
INFO,
ACTION
};
//Pour stocker à la fois la fonction et sa définition
struct TxtAndFun
{
TxtAndFun( const std::string& txt, std::function< void() > fun ) : txt( txt ), fun( fun ) {}
std::string txt;
std::function< void() > fun;
};
public:
virtual ~Page() {}
void display();
void work();
//Ajouter une fonction ou simplement une information
protected:
void add( const std::string& txt, std::function< void() > fun );
void add( const std::string& txt );
private:
std::vector< TxtAndFun > actions_;
std::vector< std::string > infos_;
//Pour garder l'ordre des informations entrées
std::vector< CallType > call_order_;
}; |
PageSummary.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| #include "Page.h"
//Creation d'une nouvelle page
class Summary : public Page
{
public:
Summary( Model& model )
{
add( "Titre" );
add( "Make Job", std::bind( &Model::change_page, &model, PageType::MAKE_JOB ));
add( "Quit", std::bind( &Model::prog_quit, &model ));
}
}; |
J'ai pour but de n'avoir pas à me préoccuper de la réponse attendue par l'utilisateur. Ce qui permettrait de changer l'interface en modifiant seulement l'ordre de mes fonctions "add".
Console
Code:
1 2 3
| Titre
1 - Make Job
0 - Quit |
Ceci fonctionne bien, cependant je n'arrive pas a passer directement une fonction en paramètre pour la "binder" dans la classe Page.
Je suis contraint de le faire avant de l'envoyer en paramètre. Ni aurait t'il pas un moyen d'avoir simplement ce qui suis en fonction ?
Code:
1 2 3 4 5 6 7 8 9 10
| class Summary : public Page
{
public:
Summary( Model& model )
{
add( "Titre" );
add( "Add Job", model.change_page( PageType::ADD_JOB ));
add( "Quit", model.prog_quit );
}
}; |
De plus je ne comprends pas bien le fait de devoir écrire "&Model::change_page, &model" pour enregistrer cette fonction "model.prog_quit()" (Que j'ai obtenue en tâtonnant :lol:)
Merci d'avance.