我需要将std :: function传递给某种算法。函数的类型是
typedef std::function<bool(const double&)> Condition;
在最简单的情况下,此功能将如下所示
bool simpleCondition(const double& d){return d<0.001;}
现在,我想传递相同的条件,但是仅当条件已连续填充多次时,该函数才应返回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;
};
我的编译器没有抱怨,它似乎可以正常运行。但是,我真的不明白为什么(使用简单的函数指针将不起作用,对吗?)。另外,我想知道是否有更简单的方法可以达到相同的目的。
我可以
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);};
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句