gpt4 book ai didi

c++ - 我可以使用 std::bind 到 "attach"状态到函数吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:30 26 4
gpt4 key购买 nike

我需要将 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;
};

我的编译器没有报错,而且似乎按预期工作。但是,我真的不明白为什么(用一个简单的函数指针是行不通的,对吧?)。另外,我想知道是否有更简单的方法来实现相同的目的。

最佳答案

Can I use std::bind to “attach” a state to a function?

是的,这正是它的用途。它返回一个包含函数指针和所有绑定(bind)参数的对象(未指定的类类型),并通过函数调用 operator() 来调用带有这些参数的函数。

std::function 然后封装该对象,允许在不知道其类型的情况下传递和调用它。这种技术称为类型删除

with a simple function pointer it would not work, right?

确实,您需要更复杂的东西才能让它工作。这就是 std::bindstd::function 提供的。

Also, I would like to know if there is a simpler way to achieve the same.

lambda 通常比绑定(bind)表达式更具可读性:

static Condition getRepeatingCondition(Condition c,int reps){
RepeatingCondition rep(c,reps);
return [rep](double d) mutable {return rep.evalCondition(d);};
}

关于c++ - 我可以使用 std::bind 到 "attach"状态到函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com