1. /*
  2. * File: main.cpp
  3. * Author: Vicky.H
  4. * Email: eclipser@163.com
  5. */
  6. #include <iostream>
  7. #include <functional>
  8. #include <typeinfo>
  9. #include <string.h>
  10.  
  11. int add1(int i, int j, int k) {
  12. return i + j + k;
  13. }
  14.  
  15. class Utils {
  16. public:
  17. Utils(const char* name) {
  18. strcpy(_name, name);
  19. }
  20.  
  21. // 类的成员函数
  22. void sayHello(const char* name) const {
  23. std::cout << _name << " say: hello " << name << std::endl;
  24. }
  25.  
  26. // 类的静态函数
  27. static int getId() {
  28. return ;
  29. }
  30.  
  31. // 运算符
  32. int operator()(int i, int j, int k) const {
  33. return i + j + k;
  34. }
  35.  
  36. private:
  37. char _name[];
  38. };
  39.  
  40. /*
  41. * 函数绑定
  42. */
  43. int main(void) {
  44.  
  45. // 绑定全局函数
  46. auto add2 = std::bind(add1, std::placeholders::_1, std::placeholders::_2, );
  47. // 函数add2 = 绑定add1函数,参数1不变,参数2不变,参数3固定为10.
  48. std::cout << typeid(add2).name() << std::endl;
  49. std::cout << "add2(1,2) = " << add2(, ) << std::endl;
  50.  
  51. std::cout << "\n---------------------------" << std::endl;
  52.  
  53. // 绑定成员函数,没有提供默认值,使用占位符
  54. Utils utils("Vicky");
  55. auto sayHello = std::bind(&Utils::sayHello, utils/*调用者*/, std::placeholders::_1/*参数1*/);
  56. sayHello("Jack");
  57.  
  58. // 绑定成员函数的时候提供了默认值
  59. auto sayHelloToLucy = std::bind(&Utils::sayHello, utils/*调用者*/, "Lucy"/*固定参数1*/);
  60. sayHelloToLucy();
  61.  
  62. // 绑定静态成员函数
  63. auto getId = std::bind(&Utils::getId);
  64. std::cout << getId() << std::endl;
  65.  
  66. std::cout << "\n---------------------------" << std::endl;
  67.  
  68. // 绑定operator函数
  69. auto add100 = std::bind(&Utils::operator (), utils, std::placeholders::_1, std::placeholders::_2, );
  70. std::cout << "add100(1, 2) = " << add100(, ) << std::endl;
  71.  
  72. // 注意:无法使用std::bind()绑定一个重载函数
  73.  
  74. return ;
  75. }
  1. #include <iostream>
  2. #include <typeinfo>
  3.  
  4. void sayHello() {
  5. std::cout << "Hello world !" << std::endl;
  6. }
  7.  
  8. int sum(int i, int j, int k) {
  9. return i + j + k;
  10. }
  11.  
  12. template <typename T>
  13. class Func {
  14. public:
  15.  
  16. Func(T fun) {
  17. if (!fun) {
  18. throw "fun nullptr";
  19. }
  20. _fun = fun;
  21. }
  22. /*
  23. * 通过多个函数模板来实现可变参数的函数调用,
  24. * @param R : 返回值类型
  25. * @param A1,A2,A3,A4,A5 :参数
  26. *
  27. */
  28. template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5>
  29. R Call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
  30. return _fun(a1, a2, a3, a4, a5);
  31. }
  32.  
  33. template<typename R, typename A1, typename A2, typename A3, typename A4>
  34. R Call(A1 a1, A2 a2, A3 a3, A4 a4) {
  35. return _fun(a1, a2, a3, a4);
  36. }
  37.  
  38. template<typename R, typename A1, typename A2, typename A3>
  39. R Call(A1 a1, A2 a2, A3 a3) {
  40. return _fun(a1, a2, a3);
  41. }
  42.  
  43. template<typename R, typename A1, typename A2>
  44. R Call(A1 a1, A2 a2) {
  45. return _fun(a1, a2);
  46. }
  47.  
  48. template<typename R, typename A1>
  49. R Call(A1 a1) {
  50. return _fun(a1);
  51. }
  52.  
  53. template<typename R>
  54. R Call() {
  55. return _fun();
  56. }
  57.  
  58. void Call() {
  59. _fun();
  60. }
  61.  
  62. private:
  63. T _fun;
  64. };
  65.  
  66. //------------------------------------------------------------------
  67.  
  68. // 需要引入 函数对象 头文件
  69. #include <functional>
  70.  
  71. /*
  72. * @param R:返回值类型
  73. * @param ... :可变参数模板
  74. */
  75. template<typename R = void, typename... Args>
  76. class Fn {
  77. public:
  78. Fn(std::function<R(Args...)> fun) : _fun(fun) {
  79. }
  80.  
  81. R operator()(Args... args) {
  82. return _fun(args...);
  83. }
  84. private:
  85. std::function<R(Args...) > _fun;
  86. };
  87.  
  88. /*
  89. * 将函数注册到对象中,通过对象直接调用
  90. */
  91. int main(void) {
  92.  
  93. //使用 含有多个不同参数的模板函数 进行注册
  94. Func<void(*)() > sayHelloFunc(sayHello);
  95. sayHelloFunc.Call();
  96.  
  97. Func<int (*)(int, int, int) > sumFunc(sum);
  98. std::cout << "sumFunc.Call<int>(1, 2, 3) : " << sumFunc.Call<int>(, , ) << std::endl;
  99.  
  100. std::cout << "\n---------------------------" << std::endl;
  101.  
  102. Fn<> sayHelloFn(sayHello);
  103. sayHelloFn();
  104.  
  105. Fn<int, int, int, int> sumFn(sum);
  106. std::cout << "sumFn(1, 2, 3) : " << sumFn(, , ) << std::endl;
  107.  
  108. std::cout << "\n---------------------------" << std::endl;
  109.  
  110. return ;
  111. }

C++11新特性之二——std::bind std::function 高级用法的更多相关文章

  1. C++11新特性总结 (二)

    1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...

  2. 【校招面试 之 C/C++】第31题 C++ 11新特性(二)之nullptr关键字

    1. 引入nullptr的原因 引入nullptr的原因,这个要从NULL说起.对于C和C++程序员来说,一定不会对NULL感到陌生.但是C和C++中的NULL却不等价.NULL表示指针不指向任何对象 ...

  3. C++11新特性应用--实现延时求值(std::function和std::bind)

    说是延时求值,注意还是想搞一搞std::function和std::bind. 之前博客<C++11新特性之std::function>注意是std::function怎样实现回调函数. ...

  4. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  5. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  6. c++ 11 线程池---完全使用c++ 11新特性

    前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介 ...

  7. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

  8. C++11新特性总结 (一)

    1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...

  9. C++11新特性——range for

    很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...

随机推荐

  1. python 统计时间,写日志

    python 统计时间使用time模块,写日志使用logging模块,这两个都是标准模板. 测试socket使用socket模块 # 统计时间 ---------------------- impor ...

  2. golang socket 实现分析(一)

    socket:tcp/udp.ip构成了网络通信的基石,tcp/ip是面向连接的通信协议 要求建立连接时进行3次握手确保连接已被建立,关闭连接时需要4次通信来保证客户端和,服务端都已经关闭 在通信过程 ...

  3. Clipboard获取内容C#

    一.获取文本  textBox1.Text = Clipboard.GetData("Text").ToString(); 二.获取图像             pictureBo ...

  4. 【C#】解析XML

    最近在尝试用WPF搞点桌面小应用. C#中使用System.Xml.XmlDocument类对XML文件进行操作. 文档详情如下: https://msdn.microsoft.com/en-us/l ...

  5. fancybox 使用方法

    项目中需要做一个相册功能.选择的是fancybox,大概记录一下使用方法: 1.引用fancybox所需要的文件,你可以下载至本地或者引用CDN. fancybox最新版本下载地址:http://fa ...

  6. 21个最佳jQuery插件推荐

    在Javascript应用领域上,使用jQuery可以制作出非常优秀的动画效果,滑块.滑球,以及各种不同的应用.精选出21个最佳的精典案例,如果你是一个前端设计师,一定不要错过. Supersized ...

  7. jump display

    查找了数据库,再在while里拼接成json是很麻烦的,所以,jump display 获得数组 <?php header("Content-Type:text/html; chars ...

  8. 中国餐馆过程(Chinese restaurant process)

    也就是说假设空桌子有a0个人,然后顾客选择桌子的概率和桌子上人数成正比. 性质: 改变用户的排列方式,桌子的排列方式,概率不变换.

  9. imx6 fec分析

    /***************************************************************************** * imx6 fec分析 * 本文主要分析 ...

  10. 将ORACLE数据库更改为归档模式;写出步骤

    解答:具体步骤如下: 1),以exp方式在线备份数据库到指定位置: 2),观察当前数据库是以服务器参数文件(spfile)方式启动还是以参数文件(pfile)方式启动: SQL> show pa ...