J'ai besoin de créer un simple rappel en c ++? Devrais-je utiliser boost :: function?

StackOverflow https://stackoverflow.com/questions/611892

  •  03-07-2019
  •  | 
  •  

Question

Supposons que j'ai un code comme celui-ci:

class Visitor {
   public:
      Visitor(callBackFunction) {}
      void visit() {
          //do something useful
          invokeCallback();
      }
}

class ClassThatCanBeVisited {
    Visitor &visitor;

    public:
       ClassThatCanBeVisited(Visitor &_visitor) : visitor(_visitor){}
       void someUsefulMethod() {
          int data= 42;
          visitor.visit(data);
       }
};


void callBackFunction() {
    //do something useful in the context of the Main file
}
int main() {
     Visitor visitor;
     ClassThatCanBeVisited foo(visitor);
     foo.someUsefulMethod();
}

Je dois créer un simple rappel qui sera appelé à chaque fois que Visitor :: visit () est appelé. Je sais que je devrais probablement mettre le code du rappel dans mon visiteur, mais il se trouve dans un contexte différent. J'aimerais donc transmettre le callBackFunction () au visiteur afin qu'il puisse invoquer ma fonction de rappel.

J'ai cherché des choses sur le Web et j'ai vu boost :: function, mais c ++ a déjà les foncteurs de base.

Lequel dois-je utiliser pour une meilleure clarté du code? Le rappel sera une simple fonction void (), mais elle pourrait augmenter, vous ne savez jamais l'avenir:)

Quelle est la façon recommandée de procéder?

Était-ce utile?

La solution

Vous pouvez utiliser l'interface de rappel et sa hiérarchie si vous ne souhaitez pas utiliser boost :: function.

class VisitorCallback
{
public:
    virtual void handle( const Visitor& ) = 0;
};

Si vous avez ou pouvez utiliser boost :: function - utilisez-le, c’est un bon moyen de vous débarrasser de toutes ces classes de rappel.

Modifier:
@edisongustavo:

boost :: function et boost :: bind ne rendront probablement pas votre code plus lisible. Mais cela vous donnera l’occasion de passer des fonctions libres (je veux dire des fonctions hors classe et des fonctions de classe statiques) en tant que rappel ainsi que des fonctions existantes de n’importe quelle classe.

Avec les fonctions de boost, vous pouvez passer des fonctions avec, par exemple, 2 paramètres en rappel qui n'attendent qu'un paramètre.

typedef boost::function< void ( int ) > IntExpectingCallback;

void TwoIntFunction( int, int );
{
}
...
IntExpectingCallback callback = boost::bind( TwoIntFunction, 5, _1 );

Mais encore une fois, cela ne rendra votre code plus lisible que si toute votre équipe le sait et favorise le boost.

Autres conseils

Oui boost :: function le ferait bien. C'est un usage très courant de celui-ci. Vous devrez utiliser boost :: bind pour lier l'instance à la fonction membre.

 func = boost::bind( &MyClass::CallbackFunc, this);

Ce serait comme vous le feriez depuis la classe.

Assurez-vous que le " this " ne disparaît pas ou votre fonction de boost se bloque au milieu d'une entête de boost quelque part.

Les réponses ci-dessus sont excellentes, mais je voudrais simplement souligner quelque chose que vous avez mentionné dans votre question, qui reste pertinent pour votre choix entre les objets de rappel C ++ (dans la réponse de Mykola) et le boost.

"Le rappel sera une simple fonction void (), mais il pourrait augmenter, vous ne savez jamais l'avenir:)"

C’est probablement la pire des raisons d’ajouter des fonctionnalités superflues, c’est-à-dire "au cas où vous en auriez besoin". Si vous ne le savez pas, ne faites pas plus que nécessaire, il y a de fortes chances que votre hypothèse soit fausse de toute façon, surtout au moment où vous en aurez besoin.

D'autre part, si vous savez qu'il est extrêmement probable que vous ayez besoin de la fonctionnalité très bientôt , il peut être intéressant de l'ajouter.

Encore une fois pour répéter ce que Mykola a dit - si votre projet l’a déjà stimulé et que votre équipe l’aime bien, utilisez-le, mais sinon, cela risque d’être exagéré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top