场景

1.C++11 引入了std::function 对象, 这个对象可以通过std::bind封装所有的函数, 并通过代理调用这个std::function的方式调用这个函数. 比如通过统一的方式调用不定参数个数的函数. 这对实现代理模式等设计模式帮助是很大的.

说明

1.cppreference 上的使用例子我就不多说了, 除了可以用在标准库上, 也是可以用在自己设计带代码结构里. 和 boost.bind,boost.function基本一样.

2.以下例子说明如何封装线程函数, 可以指定任意个数参数的函数作为线程执行函数, 和std::thread类似.

  1. // test-bind.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <Windows.h>
  5. #include <iostream>
  6. #include <functional>
  7. #include <memory>
  8. void CountLine(const std::wstring& path)
  9. {
  10. std::cout << (int*)&path << std::endl;
  11. std::wcout << path.c_str() << std::endl;
  12. }
  13. void AddNumber(int a,int b,long* sum)
  14. {
  15. *sum = a+b;
  16. }
  17. class MyThread
  18. {
  19. public:
  20. MyThread(std::function<void()> func)
  21. {
  22. func_ = func;
  23. }
  24. static DWORD WINAPI ThreadFunc1(LPVOID param)
  25. {
  26. std::function<void()>& func = *(std::function<void()>*)param;
  27. func();
  28. return 0;
  29. }
  30. void Run()
  31. {
  32. thread_ = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadFunc1,
  33. (LPVOID)&func_,
  34. 0,
  35. NULL);
  36. WaitForSingleObject(thread_, INFINITE);
  37. }
  38. HANDLE thread_;
  39. std::function<void()> func_;
  40. };
  41. MyThread* DoTask1()
  42. {
  43. std::wstring path(L"C:\\p");
  44. std::cout << (int*)&path << std::endl;
  45. CountLine(path);
  46. auto thread = new MyThread(std::bind(CountLine,path));
  47. return thread;
  48. }
  49. MyThread* DoTask2(long* sum)
  50. {
  51. auto thread = new MyThread(std::bind(AddNumber,1,2,sum));
  52. thread->Run();
  53. return thread;
  54. }
  55. int _tmain(int argc, _TCHAR* argv[])
  56. {
  57. auto thread = DoTask1();
  58. thread->Run();
  59. long sum = 0;
  60. thread = DoTask2(&sum);
  61. thread->Run();
  62. std::cout << sum << std::endl;
  63. return 0;
  64. }

输出:

  1. 003DFC84
  2. 003DFC84
  3. C:\p
  4. 005183F8
  5. C:\p
  6. 3

参考

以boost::function和boost:bind取代虚函数

std::bind

std::function

[C/C++11]_[初级]_[std::bind介绍和使用]的更多相关文章

  1. C++11中提供了std::bind

    再来看看std::bind C++11中提供了std::bind.bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的. bind的思想实际上是一种延迟计算的思想,将可调用对象保存 ...

  2. [C/C++标准库]_[初级]_[转换UTC时间到local本地时间]

    场景 1.如果有面向全球用户的网站, 一般在存储时间数据时存储的是UTC格式的时间, 这样时间是统一的, 并可以根据当地时区来进行准确的转换. 2.存储本地时间的问题就在于如果换了时区, 那么显示的时 ...

  3. [ATL/WTL]_[初级]_[选择目录对话框]

    场景 1.起因是创建标准选择目录对话框时使用了 SHCreateItemFromParsingName 函数, 这个函数支持vista以上系统. 之后再winxp上运行就报错: 无法定位程序输入点 S ...

  4. [Zlib]_[初级]_[使用zlib库压缩和解压STL string]

    场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说 ...

  5. [数据库]_[初级]_[sqlite3简单使用]

    场景 1.sqlite3在很多小型项目都会用到, 比如用来存储Android的联系人,短信等. 这个小巧的sqlite3是文件型的数据库, 也方便做配置文件和程序打包. 使用sql查询也方面. 所以s ...

  6. C++ 11新特性:std bind 原理简单图解(转载)

    本文解释了bind 是如何工作的.为了清晰,我对图中的语法作了一些简化(例如,省略函数调用操作符的参数类型),并且简化了 bind 的实现. bind 可以用来将用户提供的需要一个参数的函数转换成不需 ...

  7. [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]

    场景 1.使用win32绘图时, 最简单的api是使用 graphics.DrawImage(image,x,y)来绘制, 可是这个api有个坑,它的图片显示完整和设备分辨率(显卡)有关. 说明 1. ...

  8. C++11中的std::bind

    C++11中的std::bind 最近在看看cocos2dx的源代码,发现了cocos2dx 3.0相对于2.0改动了很多,最大的改变就是大量的使用了C++11的特性,比如auto等.其中有一个关于回 ...

  9. std::bind和std::function

    std::bind 用于绑定一个函数,返回另外一种调用方式的函数对象 ,可以改变参数顺序 和个数,特别是在多线程的程序中,经常用它将函数进行包装,然后打包发送给工作线程,让工作线程去执行我们的任务. ...

随机推荐

  1. [UI] 精美UI界面欣赏[12]

    精美UI界面欣赏[12]

  2. 使用CocoaPods

    使用CocoaPods 1. 安装CocoaPods 有时候,默认的 https://rubygems.org/ 访问不了,你需要先执行以下命令移除掉sources gem sources -r ht ...

  3. JavaScript基础进阶之数组方法总结

    数组常用方法总结:  下面我只总结了es3中常用的数组方法,一共有11个.es5中新增的9个数组方法,后续再单独总结. 1个连接数组的方法:concat() 2个数组转换为字符串的方法:join(). ...

  4. reactor模型框架图和流程图 libevent

    学习libevent有助于提升程序设计功力,除了网络程序设计方面外,libevent的代码里有很多有用的设计技巧和基础数据结构,比如信息隐藏.函数指针.c语言的多态支持.链表和堆等等,都有助于提升自身 ...

  5. SOJ1022 Uniform Generator

    Computer simulations often require random numbers. One way to generate pseudo-random numbers is via ...

  6. js等比压缩上传

    一.js文件,这个是封装过的,借用了网络上的代码然后修改的 (function(window,undefined){ var upload = function(){ this.init(); }; ...

  7. [USACO08NOV]Cheering up the Cow

    嘟嘟嘟 这道题删完边后是一棵树,那么一定和最小生成树有关啦. 考虑最后的生成树,无论从哪一个点出发,每一条边都会访问两次,而且在看一看样例,会发现走第w条边(u, v)的代价是L[w] * 2 + c ...

  8. Spring Cloud Eureka 学习记录

    SpringCloud版本 <groupId>org.springframework.cloud</groupId> <artifactId>spring-clou ...

  9. Alias自定义命令

    [root@localhost etc]# type home    --检查是否占用-bash: type: home: not found[root@localhost etc]# alias h ...

  10. c++ 多态,虚函数、重载函数、模版函数

    c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...