Uwalniam się od najlepszego sposobu implementacji wzorca strategii w C++. Do tej pory, zawsze używany standardowy sposób, jeśli z kontekstu nie ma wskaźnik do klasy bazowej strategii następująco:Jak zaimplementować wzorzec strategii w C++ z 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_;
Ponieważ posiadające wskaźniki do obiektów może spowodować złe zachowanie, szukałem dla bezpieczniejszego sposobu zaimplementowania tego wzoru i znalazłem this question, gdzie std::function
są proponowane jako lepszy sposób obsługi tego wzorca.
Czy ktoś mógłby lepiej wyjaśnić, jak działa std::function
, może z przykładem ze wzorem strategii?
W takim przypadku, jak zaimplementowałbyś F (strategię)? I dlaczego musisz używać std :: move? – gcswoosh
@Gabrielecswoosh Strategia jest po prostu dowolnym wskaźnikiem funkcji lub obiektem z przeciążonym 'operator()'.Mój przykład podaje lambdę (która definiuje 'void operator()() const'). 'std :: move' ma zapobiegać kopiowaniu. – rightfold