场景

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

说明

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

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

// test-bind.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <Windows.h>
#include <iostream>
#include <functional>
#include <memory>

void CountLine(const std::wstring& path)
{
    std::cout << (int*)&path << std::endl;
    std::wcout << path.c_str() << std::endl;
}

void AddNumber(int a,int b,long* sum)
{
    *sum = a+b;
}

class MyThread
{
public:
    MyThread(std::function<void()> func)
    {
        func_ = func;
    }

    static DWORD WINAPI ThreadFunc1(LPVOID param)
    {
        std::function<void()>& func = *(std::function<void()>*)param;
        func();
        return 0;
    }

    void Run()
    {
        thread_ = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadFunc1,
            (LPVOID)&func_,
            0,
            NULL);
        WaitForSingleObject(thread_, INFINITE);
    }

    HANDLE thread_;
    std::function<void()> func_;
};

MyThread* DoTask1()
{
    std::wstring path(L"C:\\p");
    std::cout << (int*)&path << std::endl;
    CountLine(path);
    auto thread = new MyThread(std::bind(CountLine,path));
    return thread;
}

MyThread* DoTask2(long* sum)
{
    auto thread = new MyThread(std::bind(AddNumber,1,2,sum));
    thread->Run();
    return thread;
}

int _tmain(int argc, _TCHAR* argv[])
{
    auto thread = DoTask1();
    thread->Run();

    long sum = 0;
    thread = DoTask2(&sum);
    thread->Run();
    std::cout << sum << std::endl;
    return 0;
}

输出:

003DFC84
003DFC84
C:\p
005183F8
C:\p
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. scrapy实战--爬取最新美剧

    现在写一个利用scrapy爬虫框架爬取最新美剧的项目. 准备工作: 目标地址:http://www.meijutt.com/new100.html 爬取项目:美剧名称.状态.电视台.更新时间 1.创建 ...

  2. Jmeter入门--参数化、集合点

    一.参数化 1.用户定义的变量 用户自定义变量中的定义的所有参数的值在测试计划的执行过程中不能发生取值的改变,因此一般仅将测试计划中不需要随迭代发生改变的参数(只取一次值的参数)设置在此处.例如应用的 ...

  3. ORACLE 参数设置绑定变量

    使用 CURSOR_SHARING 参数 EXACT  默认,不替换 SIMIAR 当替换不会影响到执行计划时,才会将字面量替换成绑定变量 FORCE 只要有可能,字面量会被替换为绑定变量

  4. 写markdown用于Github上readme.md文件

    Markdown 文档地址 http://pan.baidu.com/s/1o6nu9To Markdown还有一系列衍生版本,用于扩展Markdown的功能(如表格.脚注.内嵌HTML等等),这些功 ...

  5. [翻译] WPAttributedMarkup

    WPAttributedMarkup https://github.com/nigelgrange/WPAttributedMarkup WPAttributedMarkup is a simple ...

  6. 17级-车辆工程-周金霖 计算机作业 MP4音乐网站

  7. postGresql关键字字段重名

    在postGresql中如果关键字和自定义的字段重名 即使使用[  ](中括号)或者 ' '(单引号)都没有用,经本人实验. 如果使用" "(双引号),则可以.

  8. JS日期比较大小 给定时间和持续时间计算最终时间

       /* 往指定时间字符串上加时间间隔,获得新的时间字符串  * startDateStr:开始时间字符串,类似"2015-7-20 17:26:00"  * durationN ...

  9. 使用 libffi 实现 AOP

    核心还是利用oc消息的查找派发机制,进行类结构的动态修改,用新函数替换老函数,然后再调用老函数. 前言     众所周知,使用runtime的提供的接口,我们可以设定原方法的IMP,或交换原方法和目标 ...

  10. AOP的本质

    AOP的本质是HOOK: HOOK的本质是:新函数包含原函数或新函数替换原函数: 需要解决的问题: 1.新函数的生成: 2.新函数的调用机制: 3.原函数的调用机制: 新函数的生成: 1.将已有的动态 ...