implementiere Ich interessiere mich für den besten Weg, um das Strategie-Muster in C++ zu implementieren. Bis jetzt habe ich früher immer den Standard-Weg, wo der Kontext einen Zeiger auf die Basisstrategie Klasse wie folgt:Wie man Strategiemuster in C++ mit 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_;
Da Zeiger auf Objekte, die in einem schlechten Verhalten führen kann, ich war auf der Suche für eine sicherere Weise, dieses Muster zu implementieren, und ich fand this question, wo std::function
vorgeschlagen werden, als eine bessere Möglichkeit, dieses Muster zu behandeln.
Könnte jemand bitte besser erklären, wie std::function
funktioniert, vielleicht mit einem Beispiel mit dem Strategie-Muster?
In diesem Fall, wie würden Sie F (die Strategie) implementieren? Und warum müssen Sie std :: move verwenden? – gcswoosh
@Gabrielecswoosh Die Strategie ist nur irgendein Funktionszeiger oder Objekt mit 'operator()' überladen.Mein Beispiel übergibt ein Lambda (definiert "void operator()() const"). 'std :: move' soll eine Kopie verhindern. – rightfold