Ich muss eine std :: -Funktion an einen Algorithmus übergeben. Die Art der Funktion istKann ich std :: bind verwenden, um einen Status an eine Funktion anzuhängen?
typedef std::function<bool(const double&)> Condition;
Im einfachsten Fall diese Funktion wie diese
bool simpleCondition(const double& d){return d<0.001;}
aussehen Nun möchte ich den gleichen Zustand zu übergeben, aber nur dann, wenn die Bedingung mehrere Male erfüllt in eine Zeile, sollte die Funktion wahr zurückgeben. Ich habe folgendes versucht
class RepeatingCondition{
public:
static Condition getRepeatingCondition(Condition c,int reps){
return std::bind(&RepeatingCondition::evalCondition,
RepeatingCondition(c,reps),_1);
}
private:
RepeatingCondition(Condition cc,int reps) : counter(0),
reps(reps),cond(cc){}
bool evalCondition(const double& d){
if (cond(d)){counter += 1;}
else {counter = 0;}
return (counter >= reps);
}
Condition cond;
int counter,reps;
};
Mein Compiler klagen nicht und es scheint zu funktionieren wie erwartet. Allerdings verstehe ich nicht wirklich warum (mit einem einfachen Funktionszeiger würde es nicht funktionieren, oder?). Außerdem würde ich gerne wissen, ob es einen einfacheren Weg gibt, dasselbe zu erreichen.
Mit einem Lambda: 'statische Bedingung getRepeatingCondition (Bedingung c, int Wiederholungen) {int counter = 0; return [=] (double const d) änderbar {return if (c (d)) counter + = 1; else counter = 0; Rückkehrzähler> = Wiederholungen; }} ' – dyp
Beachten Sie, dass Sie den obigen Code vereinfachen können, indem Sie' RepeatingCondition :: evalCondition' in 'operator()' umbenennen, öffentlich machen und 'std :: bind (RepeedigCondition (c, reps), _1)' verwenden in 'getRepeatingCondition'. – dyp
Ist eine statische Methode mit einem statischen Zähler nicht in Frage? Das könnte die Dinge ein wenig vereinfachen und es Ihnen ermöglichen, das Objekt vollständig zu entfernen. Hinweis: Ich behaupte nicht, dass dies die beste Lösung ist, da ich Ihre anderen Anwendungsfälle nicht kenne. – AndyG