我需要将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;
};
我的编译器没有抱怨,它似乎按预期工作。但是,我真的不明白为什么(使用简单的函数指针它不起作用,对吧?)。另外,我想知道是否有更简单的方法来实现同样的目标。
答案 0 :(得分:8)
我可以使用
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);};
}
答案 1 :(得分:1)
由于@Mike Seymour已采用lambda方法,我将提出一个使用仿函数的替代方法,这可能是问题代码的一个很好的替代方案:
class RepeatingCondition {
Condition m_condition;
int m_counter, m_reps;
public:
RepeatingCondition(Condition c, int reps)
: m_condition(c), m_counter(0) , m_reps(reps) { }
bool operator()(const double d) {
if(m_codition(d)) {
m_counter += 1;
} else {
m_counter = 0;
}
return (m_counter >= m_reps);
}
};
现在,您可以使用RepeatingCondition
类创建所需的实例,如下所示:
RepeatingCondition repCond(checkDouble, 12);
if(repCond(5.4)) { // calls the operator() overload
std::cout << "condition met\n";
}