场景

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

最新文章

  1. List接口
  2. AES加密时的 java.security.InvalidKeyException: Illegal key size 异常
  3. HDU 2058 The sum problem
  4. Chrome浏览器插件
  5. 深入理解CSS3 animation的steps
  6. div 绝对布局居中
  7. C++中的多态
  8. Linux下iptables拦截Nginx的问题
  9. C#学习笔记之线程 - 同步上下文
  10. Openstack安装
  11. SimpleDateFormat的线程安全问题
  12. iOS开发之——巧用反射机制
  13. C#中创建、打开、读取、写入、保存Excel的一般性代码
  14. 【HDOJ】4983 Goffi and GCD
  15. Borg Maze(bfs+prim)
  16. 计算机世界的道(C/ASM)生一(OS),一生二(API),二生万象(MFC/COM)——学包装技术的程序员将来会损失比较大,因为不了解本质,一旦包装过时就会被淘汰
  17. Delphi中打开网页连接的几种方法
  18. bzoj-1179(缩点+最短路)
  19. JS 画框操作
  20. mui 窗口管理及窗口之间的数据传递

热门文章

  1. vim和xshell配色
  2. mysql数据库的常用命令总结及具体操作步骤
  3. 转:c# 安装包制作
  4. [翻译] Icon and Image Sizes
  5. mysql宕机,导致innodb_force_recovery恢复不了
  6. Linux 下shell 编程学习脚手架
  7. Hello World ! 第一篇随笔
  8. awk.md
  9. 2018年1月12日--微信小程序----出错报告(40kb的原因)---并解决方法
  10. 多线程之Timer和TimerTask