C++11新特性之二——std::bind std::function 高级用法
- /*
- * 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 高级用法的更多相关文章
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- 【校招面试 之 C/C++】第31题 C++ 11新特性(二)之nullptr关键字
1. 引入nullptr的原因 引入nullptr的原因,这个要从NULL说起.对于C和C++程序员来说,一定不会对NULL感到陌生.但是C和C++中的NULL却不等价.NULL表示指针不指向任何对象 ...
- C++11新特性应用--实现延时求值(std::function和std::bind)
说是延时求值,注意还是想搞一搞std::function和std::bind. 之前博客<C++11新特性之std::function>注意是std::function怎样实现回调函数. ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- c++ 11 线程池---完全使用c++ 11新特性
前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
随机推荐
- python 统计时间,写日志
python 统计时间使用time模块,写日志使用logging模块,这两个都是标准模板. 测试socket使用socket模块 # 统计时间 ---------------------- impor ...
- golang socket 实现分析(一)
socket:tcp/udp.ip构成了网络通信的基石,tcp/ip是面向连接的通信协议 要求建立连接时进行3次握手确保连接已被建立,关闭连接时需要4次通信来保证客户端和,服务端都已经关闭 在通信过程 ...
- Clipboard获取内容C#
一.获取文本 textBox1.Text = Clipboard.GetData("Text").ToString(); 二.获取图像 pictureBo ...
- 【C#】解析XML
最近在尝试用WPF搞点桌面小应用. C#中使用System.Xml.XmlDocument类对XML文件进行操作. 文档详情如下: https://msdn.microsoft.com/en-us/l ...
- fancybox 使用方法
项目中需要做一个相册功能.选择的是fancybox,大概记录一下使用方法: 1.引用fancybox所需要的文件,你可以下载至本地或者引用CDN. fancybox最新版本下载地址:http://fa ...
- 21个最佳jQuery插件推荐
在Javascript应用领域上,使用jQuery可以制作出非常优秀的动画效果,滑块.滑球,以及各种不同的应用.精选出21个最佳的精典案例,如果你是一个前端设计师,一定不要错过. Supersized ...
- jump display
查找了数据库,再在while里拼接成json是很麻烦的,所以,jump display 获得数组 <?php header("Content-Type:text/html; chars ...
- 中国餐馆过程(Chinese restaurant process)
也就是说假设空桌子有a0个人,然后顾客选择桌子的概率和桌子上人数成正比. 性质: 改变用户的排列方式,桌子的排列方式,概率不变换.
- imx6 fec分析
/***************************************************************************** * imx6 fec分析 * 本文主要分析 ...
- 将ORACLE数据库更改为归档模式;写出步骤
解答:具体步骤如下: 1),以exp方式在线备份数据库到指定位置: 2),观察当前数据库是以服务器参数文件(spfile)方式启动还是以参数文件(pfile)方式启动: SQL> show pa ...