/*
* 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. 基于jquery带时间轴的图片轮播切换代码

    基于jquery图片标题随小圆点放大切换.这是是一款带时间轴的图片轮播切换代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="decoroll2 ...

  2. 【WPF/WAF】界面布局(View)文件的多层嵌套(Nest)

    碎碎念:使用的是略冷门的Window Application Foundation(WAF)框架,搜到的都是WPF的UserControl用户控件的用法,实在蛋疼. 需求:主界面ShellWindow ...

  3. 在CMD下启动vmware、Xshell连接虚拟机以及控制Chrome浏览器自动执行js登录校园网

    标题有点长,主要是写个bat出来玩玩, (1)不用每次都手动关闭mysql服务(我不想把它设为手动启动,有强迫症) (2)然后希望每次vmware能自动连上虚拟机 (3)以及每次Xshell都能自动启 ...

  4. Dropwizard与Spring Boot比较

    在这篇文章中我们将讨论的Java轻量级框架Dropwizard和Spring Boot的相似性和差异. 首先,这是一个选择自由和速度需要,无论你在Dropwizard和Spring Boot选择哪个, ...

  5. MVC教程三:URL匹配

    1.使用{parameter}做模糊匹配 {parameter}:花括弧加任意长度的字符串,字符串不能定义成controller和action字母.默认的就是模糊匹配. 例如:{admin}. usi ...

  6. Entity Framework管理实体关系(一):管理一对一关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种 ...

  7. BuddyPress创建组、查看成员信息等找不到页面

    BuddyPress创建组.查看成员信息等找不到页面 http://aoxuangame.com/wordpress/groups/create/ http://aoxuangame.com/word ...

  8. php BC高精确度函数库

    #两个高精度数比较 #int bccomp ( string $left_operand , string $right_operand [, int $scale ] ) #$left=$right ...

  9. 10分钟学会写Jquery插件

    最近很多网友说jquery插件是什么啊?怎么写的啊?我不会写啊?   一大堆的问题一时都不知道怎么回答他们,个人认为是网友们把问题复杂化了. 其实就是把一些常用.实用.通用的功能封装起来而以,简单的来 ...

  10. : error C3861: “Sleep”: 找不到标识符

    编译的时候:error C3861: “sleep”: 找不到标识符,是什么原因啊?编译的时候:error C3861: “sleep”: 找不到标识符,是什么原因啊?哪位好心的哥哥告诉我吧,分全是你 ...