我可以使用std :: bind来"附加"一个国家的功能?

时间:2014-12-19 17:16:19

标签: c++ c++11 std

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

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

2 个答案:

答案 0 :(得分:8)

  

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

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

然后

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

  

使用简单的函数指针它不起作用,对吗?

事实上,你需要一些更复杂的工作。这是std::bindstd::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";
}