我需要将std :: function传递给某些算法.功能的类型是
typedef std::function<bool(const double&)> Condition;
Run Code Online (Sandbox Code Playgroud)
在最简单的情况下,此函数将如下所示
bool simpleCondition(const double& d){return d<0.001;}
Run Code Online (Sandbox Code Playgroud)
现在我想传递相同的条件,但只有当条件连续多次填满时,该函数才会返回true.我尝试了以下内容
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;
};
Run Code Online (Sandbox Code Playgroud)
我的编译器没有抱怨,它似乎按预期工作.但是,我真的不明白为什么(使用简单的函数指针它不起作用,对吧?).另外,我想知道是否有更简单的方法来实现同样的目标.
我可以使用
std::bind"附加"状态到函数吗?
是的,这正是它的用途.它返回一个包含函数指针和所有绑定参数的对象(未指定类类型),并使用函数调用operator()来调用带有这些参数的函数.
std::function然后封装该对象,允许它在不知道其类型的情况下传递和调用.这种技术称为类型擦除.
使用简单的函数指针它不起作用,对吧?
实际上,你需要一些更复杂的工作.这是什么std::bind和std::function提供.
另外,我想知道是否有更简单的方法来实现同样的目标.
lambda通常比绑定表达式更具可读性:
static Condition getRepeatingCondition(Condition c,int reps){
RepeatingCondition rep(c,reps);
return [rep](double d) mutable {return rep.evalCondition(d);};
}
Run Code Online (Sandbox Code Playgroud)