我可以使用std :: bind将状态"附加"到函数中吗?

for*_*818 5 c++ std c++11

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

我的编译器没有抱怨,它似乎按预期工作.但是,我真的不明白为什么(使用简单的函数指针它不起作用,对吧?).另外,我想知道是否有更简单的方法来实现同样的目标.

Mik*_*our 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);};
}
Run Code Online (Sandbox Code Playgroud)