Sono entusiasta del modo migliore per implementare il modello di strategia in C++. Fino ad ora, ho sempre usato il modo standard, dove il contesto ha un puntatore alla classe strategia di base come segue:Come implementare il modello di strategia in C++ con std :: function
class AbstractStrategy{
public:
virtual void exec() = 0;
}
class ConcreteStrategyA{
public:
void exec();
}
class ConcreteStrategyB{
public:
void exec();
}
class Context{
public:
Context(AbstractStrategy* strategy):strategy_(strategy){}
~Context(){
delete strategy;
}
void run(){
strategy->exec();
}
private:
AbstractStrategy* strategy_;
Dal momento che avere puntatori a oggetti può provocare un cattivo comportamento, ero alla ricerca per un modo più sicuro per implementare questo modello e ho trovato this question dove std::function
sono proposti come un modo migliore per gestire questo modello.
Qualcuno potrebbe spiegare meglio come funziona std::function
, magari con un esempio con lo schema di strategia?
In questo caso, come implementeresti F (la strategia)? E perché è necessario utilizzare std :: move? – gcswoosh
@Gabrielecswoosh La strategia è qualsiasi funzione puntatore o oggetto con 'operator()' sovraccarico.Il mio esempio passa a lambda (che definisce 'void operator()() const'). 'std :: move' serve per prevenire una copia. – rightfold