如何捕获函数参数并存储函数指针以供以后在C ++ 11中执行?

阿布舍克禁令

我的要求是存储一些函数,以便以后使用预定义的参数执行。这是我尝试过的

void doSomething(int i, int j) {
    std::cout << "Sum " <<  i + j << std::endl;
}

int main(int argc, char *argv[]) {
    std::vector<std::function<void(int, int)>> functionVector;

    functionVector.push_back(std::bind(doSomething, 1, 2));
    functionVector.push_back(std::bind(doSomething, 4, 2));

    functionVector[0]();
    functionVector[1]();
}

但是,这不能编译并给出以下错误

error: no matching function for call to object of type 'std::__1::__vector_base<std::__1::function<void (int, int)>,
      std::__1::allocator<std::__1::function<void (int, int)> > >::value_type' (aka 'std::__1::function<void (int, int)>')
    functionVector[0]();
    ^~~~~~~~~~~~~~~~~

我怎样才能做到这一点C++11/14

核桃

将参数绑定到函数后,调用不再使用任何其他参数。因此,函数类型应为void()

std::vector<std::function<void()>> functionVector;

另请注意,您可以在C ++ 11和更高版本中使用lambda,它们比std::bind

functionVector.push_back([](){ doSomething(1, 2); });
functionVector.push_back([](){ doSomething(4, 2); });

或略微简化,可以省略空的参数列表:

functionVector.push_back([]{ doSomething(1, 2); });
functionVector.push_back([]{ doSomething(4, 2); });

如您所见,lambda在这里没有任何参数,因此其调用运算符的类型为void()


尽管不会产生任何实际变化,但我也建议您使用emplace_back(C ++ 11起)代替push_back

push_back期望引用元素类型(在此处std::function<void()>),但是由于您要传递其他内容,因此std::function<void()>将首先将构造为push_back参数的临时对象,然后将其从其构造为向量元素。

emplace_back另一方面,期望vector元素的构造函数参数,并将std::function<void()>直接就地构造对象,而无需中间临时对象。


在这种特定情况下std::function,使用lambda时也不必要,因为没有捕获的lambda会衰减到函数指针,您可以将其存储为以下内容的轻量级替代std::function

std::vector<void(*)()> functionVector;

如果您打算存储带有捕获的lambda,则std::function需要使用方法。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在javascript中,如何传递带有参数的函数以供以后调用?

来自分类Dev

如何对面部识别特征值进行哈希处理并存储在数据库中以供以后比较

来自分类Dev

将函数结果存储到变量中以供以后在PHP中使用?

来自分类Dev

成员函数指针的decltype作为c ++ 11中的模板参数

来自分类Dev

成员函数指针的decltype作为c ++ 11中的模板参数

来自分类Dev

将用户输入数据保存在kivy中并存储以供以后使用/分析python

来自分类Dev

如何在Oracle 11g中执行存储过程

来自分类Dev

如何调用以指针数组为参数的函数?在C中

来自分类Dev

如何将参数传递给C中的函数指针?

来自分类Dev

如何在C ++中访问传递指针函数的参数

来自分类Dev

如何在Rascal中执行“函数指针”?

来自分类Dev

在C ++ 11中使用函数指针

来自分类Dev

如何在函数指针中包含参数?

来自分类Dev

指针作为C中的函数参数

来自分类Dev

void **函数参数c ++中的指针

来自分类Dev

C ++函数指针作为Doxygen中的参数

来自分类Dev

指针数组作为c函数中的参数

来自分类Dev

函数指针执行中的错误

来自分类Dev

Android Delphi XE7如何存储函数指针以供以后访问?

来自分类Dev

如何在Oracle 11g中执行CTE查询

来自分类Dev

如何在C中调用具有函数指针作为参数的函数?

来自分类Dev

在C ++中执行函数作为参数

来自分类Dev

如何在C ++ 11中转换忽略参数的函数?

来自分类Dev

C ++ 11中的函数返回函数指针

来自分类Dev

可变参数函数和任意参数保存以供将来执行

来自分类Dev

在构造函数中初始化的c ++ 11线程以执行方法

来自分类Dev

使用C ++ 11智能指针作为C函数参数

来自分类Dev

如何处理C中可变参数函数中作为参数传递的空指针

来自分类Dev

如何处理C中可变参数函数中作为参数传递的空指针

Related 相关文章

  1. 1

    在javascript中,如何传递带有参数的函数以供以后调用?

  2. 2

    如何对面部识别特征值进行哈希处理并存储在数据库中以供以后比较

  3. 3

    将函数结果存储到变量中以供以后在PHP中使用?

  4. 4

    成员函数指针的decltype作为c ++ 11中的模板参数

  5. 5

    成员函数指针的decltype作为c ++ 11中的模板参数

  6. 6

    将用户输入数据保存在kivy中并存储以供以后使用/分析python

  7. 7

    如何在Oracle 11g中执行存储过程

  8. 8

    如何调用以指针数组为参数的函数?在C中

  9. 9

    如何将参数传递给C中的函数指针?

  10. 10

    如何在C ++中访问传递指针函数的参数

  11. 11

    如何在Rascal中执行“函数指针”?

  12. 12

    在C ++ 11中使用函数指针

  13. 13

    如何在函数指针中包含参数?

  14. 14

    指针作为C中的函数参数

  15. 15

    void **函数参数c ++中的指针

  16. 16

    C ++函数指针作为Doxygen中的参数

  17. 17

    指针数组作为c函数中的参数

  18. 18

    函数指针执行中的错误

  19. 19

    Android Delphi XE7如何存储函数指针以供以后访问?

  20. 20

    如何在Oracle 11g中执行CTE查询

  21. 21

    如何在C中调用具有函数指针作为参数的函数?

  22. 22

    在C ++中执行函数作为参数

  23. 23

    如何在C ++ 11中转换忽略参数的函数?

  24. 24

    C ++ 11中的函数返回函数指针

  25. 25

    可变参数函数和任意参数保存以供将来执行

  26. 26

    在构造函数中初始化的c ++ 11线程以执行方法

  27. 27

    使用C ++ 11智能指针作为C函数参数

  28. 28

    如何处理C中可变参数函数中作为参数传递的空指针

  29. 29

    如何处理C中可变参数函数中作为参数传递的空指针

热门标签

归档