/*
* File: main.cpp
* Author: Vicky.H
* Email: eclipser@163.com
*/
#include <iostream>
#include <functional>
#include <typeinfo>
#include <string.h> int add1(int i, int j, int k) {
return i + j + k;
} class Utils {
public:
Utils(const char* name) {
strcpy(_name, name);
} // 类的成员函数
void sayHello(const char* name) const {
std::cout << _name << " say: hello " << name << std::endl;
} // 类的静态函数
static int getId() {
return ;
} // 运算符
int operator()(int i, int j, int k) const {
return i + j + k;
} private:
char _name[];
}; /*
* 函数绑定
*/
int main(void) { // 绑定全局函数
auto add2 = std::bind(add1, std::placeholders::_1, std::placeholders::_2, );
// 函数add2 = 绑定add1函数,参数1不变,参数2不变,参数3固定为10.
std::cout << typeid(add2).name() << std::endl;
std::cout << "add2(1,2) = " << add2(, ) << std::endl; std::cout << "\n---------------------------" << std::endl; // 绑定成员函数,没有提供默认值,使用占位符
Utils utils("Vicky");
auto sayHello = std::bind(&Utils::sayHello, utils/*调用者*/, std::placeholders::_1/*参数1*/);
sayHello("Jack"); // 绑定成员函数的时候提供了默认值
auto sayHelloToLucy = std::bind(&Utils::sayHello, utils/*调用者*/, "Lucy"/*固定参数1*/);
sayHelloToLucy(); // 绑定静态成员函数
auto getId = std::bind(&Utils::getId);
std::cout << getId() << std::endl; std::cout << "\n---------------------------" << std::endl; // 绑定operator函数
auto add100 = std::bind(&Utils::operator (), utils, std::placeholders::_1, std::placeholders::_2, );
std::cout << "add100(1, 2) = " << add100(, ) << std::endl; // 注意:无法使用std::bind()绑定一个重载函数 return ;
}
#include <iostream>
#include <typeinfo> void sayHello() {
std::cout << "Hello world !" << std::endl;
} int sum(int i, int j, int k) {
return i + j + k;
} template <typename T>
class Func {
public: Func(T fun) {
if (!fun) {
throw "fun nullptr";
}
_fun = fun;
}
/*
* 通过多个函数模板来实现可变参数的函数调用,
* @param R : 返回值类型
* @param A1,A2,A3,A4,A5 :参数
*
*/
template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5>
R Call(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
return _fun(a1, a2, a3, a4, a5);
} template<typename R, typename A1, typename A2, typename A3, typename A4>
R Call(A1 a1, A2 a2, A3 a3, A4 a4) {
return _fun(a1, a2, a3, a4);
} template<typename R, typename A1, typename A2, typename A3>
R Call(A1 a1, A2 a2, A3 a3) {
return _fun(a1, a2, a3);
} template<typename R, typename A1, typename A2>
R Call(A1 a1, A2 a2) {
return _fun(a1, a2);
} template<typename R, typename A1>
R Call(A1 a1) {
return _fun(a1);
} template<typename R>
R Call() {
return _fun();
} void Call() {
_fun();
} private:
T _fun;
}; //------------------------------------------------------------------ // 需要引入 函数对象 头文件
#include <functional> /*
* @param R:返回值类型
* @param ... :可变参数模板
*/
template<typename R = void, typename... Args>
class Fn {
public:
Fn(std::function<R(Args...)> fun) : _fun(fun) {
} R operator()(Args... args) {
return _fun(args...);
}
private:
std::function<R(Args...) > _fun;
}; /*
* 将函数注册到对象中,通过对象直接调用
*/
int main(void) { //使用 含有多个不同参数的模板函数 进行注册
Func<void(*)() > sayHelloFunc(sayHello);
sayHelloFunc.Call(); Func<int (*)(int, int, int) > sumFunc(sum);
std::cout << "sumFunc.Call<int>(1, 2, 3) : " << sumFunc.Call<int>(, , ) << std::endl; std::cout << "\n---------------------------" << std::endl; Fn<> sayHelloFn(sayHello);
sayHelloFn(); Fn<int, int, int, int> sumFn(sum);
std::cout << "sumFn(1, 2, 3) : " << sumFn(, , ) << std::endl; std::cout << "\n---------------------------" << std::endl; return ;
}

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. VBA学习笔记(3)--文件夹操作

    说明(2017.3.22): 1. 根据兰色幻想VBA80集视频教学,总结 2. 大部分可以用自带函数处理,不过复制文件夹需要用到FileSystemObject对象,打开文件夹用到shell Pub ...

  2. centos 7 上配置mysql 开机启动详解

    之前多次在centos7环境下配置mysql开机自启动出现了错误.现留下篇文章已做记录 一.centos7与centos6相比有什么不同: 1 在centos7中服务不在是用service这个命令来启 ...

  3. 【WPF/C#】测试下载文件(图片)

    需求:界面上有一个按钮,点击后联网下载一张PNG图片,保存到本地指定路径. 重要参考: http://stackoverflow.com/questions/24797485/how-to-downl ...

  4. C++ for fun & test

    #include <iostream> using namespace std; class DaYe { public: const DaYe & gege() const { ...

  5. size_t ssize_t socklen_t

    size_t 解释一:为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样. 在32位系统上 定义为 unsigned int 也就 ...

  6. Windoows窗口程序三

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h& ...

  7. 如何对抗、预防 SQL注入 攻击

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  8. (转)live555从RTSP服务器读取数据到使用接收到的数据流程分析

    本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为 ...

  9. 基于Linux的智能家居的设计(4)

    3  开发环境的搭建 本次课题使用的开发环境比較特殊.没有一个现成的集成开发环境,需要自己一步一步的搭建开发环境,开发环境的搭建的过程十分复杂,并且假设没有这个开发环境本次课题就无法进行. 因此.在进 ...

  10. RAC DBCA 找不到共享磁盘

    (一)  前言:  通过vmware workstation 走iscsi协议.安装RAC 集群架构,DBCA 时不能识别ASM 共享存储(按理来说这一版都是权限的问题).同一时候,本想通过RMAN ...