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

maximum_prime_is_463035818

我需要将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::bindstd::function提供。

另外,我想知道是否有更简单的方法可以达到相同的目的。

Lambda通常比绑定表达式更具可读性:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用std :: string * argv作为主要函数参数吗?

来自分类Dev

我可以使用istream_iterator <char>将一些istream内容复制到std :: string吗?

来自分类Dev

我可以使用 Roslyn DocumentEditor 将语句插入到空函数体中吗

来自分类Dev

我们可以使用参数包作为std :: vector初始化程序吗?

来自分类Dev

我可以使用std :: unique_ptr <BaseClass>(&DerivedClass)吗?

来自分类Dev

我可以使用 `std::path::Path` 的 `strip_prefix` 来替换动态前缀吗?

来自分类Dev

我可以使用 std::vector::swap 修改共享向量吗?

来自分类Dev

我可以使用std :: vector <std :: vector <T >>表示C ++中的二维数组吗?

来自分类Dev

我可以使用通配符附加和订阅频道吗?

来自分类Dev

我可以使用python CSP吗?

来自分类Dev

我可以使用迭代器吗?

来自分类Dev

我可以使用通配符替换吗

来自分类Dev

我可以使用RTF格式吗?

来自分类Dev

骨骼可以使用我的插件吗?

来自分类Dev

我可以使用borg备份到Amazon Glacier吗?

来自分类Dev

我们可以使用Java Mail API将Gmail邮件附加到Yahoo吗

来自分类Dev

有人可以使用.bind()函数向我解释此代码吗?

来自分类Dev

有人可以使用.bind()函数向我解释此代码吗?

来自分类Dev

我可以使用const引用代替getter函数吗?

来自分类Dev

我可以使用参数传递的函数吗?

来自分类Dev

我可以使用内在函数加速类型转换吗?

来自分类Dev

我可以使用标准JavaScript函数创建XMLHttpRequest吗?

来自分类Dev

我可以使用stdlib函数的#define表示形式吗?

来自分类Dev

异步函数JS问题。我可以使用Promises吗?

来自分类Dev

我可以使用函数在python中导入模块吗

来自分类Dev

我可以使用void *作为函数的参数吗?

来自分类Dev

我可以使用 onclick 调用 php 函数吗

来自分类Dev

我可以使用类型声明函数吗

来自分类Dev

我可以使用 IEnumerator 作为更新函数吗?

Related 相关文章

  1. 1

    我可以使用std :: string * argv作为主要函数参数吗?

  2. 2

    我可以使用istream_iterator <char>将一些istream内容复制到std :: string吗?

  3. 3

    我可以使用 Roslyn DocumentEditor 将语句插入到空函数体中吗

  4. 4

    我们可以使用参数包作为std :: vector初始化程序吗?

  5. 5

    我可以使用std :: unique_ptr <BaseClass>(&DerivedClass)吗?

  6. 6

    我可以使用 `std::path::Path` 的 `strip_prefix` 来替换动态前缀吗?

  7. 7

    我可以使用 std::vector::swap 修改共享向量吗?

  8. 8

    我可以使用std :: vector <std :: vector <T >>表示C ++中的二维数组吗?

  9. 9

    我可以使用通配符附加和订阅频道吗?

  10. 10

    我可以使用python CSP吗?

  11. 11

    我可以使用迭代器吗?

  12. 12

    我可以使用通配符替换吗

  13. 13

    我可以使用RTF格式吗?

  14. 14

    骨骼可以使用我的插件吗?

  15. 15

    我可以使用borg备份到Amazon Glacier吗?

  16. 16

    我们可以使用Java Mail API将Gmail邮件附加到Yahoo吗

  17. 17

    有人可以使用.bind()函数向我解释此代码吗?

  18. 18

    有人可以使用.bind()函数向我解释此代码吗?

  19. 19

    我可以使用const引用代替getter函数吗?

  20. 20

    我可以使用参数传递的函数吗?

  21. 21

    我可以使用内在函数加速类型转换吗?

  22. 22

    我可以使用标准JavaScript函数创建XMLHttpRequest吗?

  23. 23

    我可以使用stdlib函数的#define表示形式吗?

  24. 24

    异步函数JS问题。我可以使用Promises吗?

  25. 25

    我可以使用函数在python中导入模块吗

  26. 26

    我可以使用void *作为函数的参数吗?

  27. 27

    我可以使用 onclick 调用 php 函数吗

  28. 28

    我可以使用类型声明函数吗

  29. 29

    我可以使用 IEnumerator 作为更新函数吗?

热门标签

归档