c++11 学习
- #include <iostream> // std::cout
- #include <functional> // std::ref
- #include <thread> // std::thread
- #include <future> // std::promise, std::future
- void print_int1(int& value) {
- std::cout << "value1: " << value << '\n'; // 打印 value: 10.
- value = ;
- }
- void print_int2(int value) {
- std::cout << "value2: " << value << '\n'; // 打印 value: 10.
- value = ;
- }
- int main ()
- {
- int value1 = ;
- int value2 = ;
- std::thread t1(print_int1, std::ref(value1));
- t1.join();
- std::thread t2(print_int2, value2);
- t2.join();
- std::cout << "value1: " << value1 << '\n'; // 打印 value: 10.
- std::cout << "value2: " << value2 << '\n'; // 打印 value: 10.
- return ;
- }
g++ future.cpp -std=c++1y -g -pthread
.输出:
- value1:
- value2:
- value1:
- value2:
可见,当函数 print_int1(int&),且std::ref(value1) 时,是传递的引用。
- #include <functional>
- #include <iostream>
- void f(int& n1, int& n2, const int& n3)
- {
- std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
- ++n1; // increments the copy of n1 stored in the function object
- ++n2; // increments the main()'s n2
- // ++n3; // compile error
- }
- int main()
- {
- int n1 = 1, n2 = 2, n3 = 3;
- std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
- n1 = 10;
- n2 = 11;
- n3 = 12;
- std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
- bound_f();
- std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
- }
输出:
- Before function: 10 11 12
- In function: 1 11 12
- After function: 10 12 12
http://zh.cppreference.com/w/cpp/utility/functional/ref
- #include <thread>
- #include <iostream>
- using namespace std;
- void func1(int& a)
- {
- a++;
- }
- void func2(int a)
- {
- a++;
- }
- int main()
- {
- int a = ;
- std::thread t1(func1, std::ref(a));
- std::thread t2(func2, a);
- std::thread t3(func2, std::ref(a));
- //std::thread t4(func1, a); 编译错误
- t1.join();
- t2.join();
- t3.join();
- std::cout << a << std::endl; return ;
- }
输出43,注意,func1 的参数是引用,因此要用std::ref, func2的参数是值拷贝,因此传a,对于 thread3,虽然传的是std::ref, 但由于参数是值拷贝,因此不会对a有影响。
对于 thread4,会产生编译错误,还在思考为什么thread3 不会产生编译错误
理解了bind也就好理解上面的thread3 是可以编译通过的原因,
http://www.cnblogs.com/xusd-null/p/3698969.html
(原文:http://blog.think-async.com/2010/04/bind-illustrated.html)
本文解释了bind
是如何工作的。为了清晰,我对图中的语法作了一些简化(例如,省略函数调用操作符的参数类型),并且简化了 bind
的实现.
1. bind
可以用来将用户提供的需要一个参数的函数转换成不需要参数的函数对象。绑定的值(在这个例子中是123)存储在函数对象内并且会被自动传递给用户指定的函数:
2. 参数绑定也可以用于将类成员函数转换成零参数的函数对象。猿类们都知道,非静态成员函数需要一个隐式的 this
参数。这意味着需要绑定一个合适的类实例指针到这个函数对象:
3. 相应地,隐式的 this
指针也可以显式地传递给需要一个参数的函数对象:
4. 函数对象经常同时使用提前绑定的参数和调用时才提供的参数。这个可以用成员函数来实现:
5. 当然也可以使用非成员函数:
6. 有些时候函数对象被调用时会提供多余的参数,而这些参数是目标函数不需要的。bind
会自动忽略这些多余的参数:
7. 这些多余的参数不需要一定在函数对象签名的最后:
8. 最后, bind
还允许重新组织函数对象的参数顺序:
c++11 学习的更多相关文章
- C++11 学习笔记 std::function和bind绑定器
C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...
- C++ 11 学习1:类型自动推导 auto和decltype
Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...
- C++11学习
转自: https://www.cnblogs.com/llguanli/p/8732481.html Boost教程: http://zh.highscore.de/cpp/boost/ 本章目的: ...
- C++11学习之share_ptr和weak_ptr
一.shared_ptr学习 1.shared_ptr和weak_ptr 基础概念 shared_ptr与weak_ptr智能指针均是C++ RAII的一种应用,可用于动态资源管理 shared_pt ...
- Linux0.11学习
Linux 0.11虽然不是什么“珠穆朗玛峰”,但它肯定还是“华山”或“泰山”.虽然有路但你还是需要最基本的努力和花费一定的代价才能“攀登”上去.1. PC兼容机硬件工作原理(比如8259A,8253 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11学习笔记
C++11 1.long long新类型 2.列表初始化 int t=0; int t={0}; int t(0); int t{0}; 注意:如果我们使用列表初始化有丢失信息的风险,则编译器报错 l ...
- C++ 11学习(1):lambda表达式
转载请注明,来自:http://blog.csdn.net/skymanwu #include <iostream> #include <vector> #include &l ...
- C++ 11 学习3:显示虚函数重载(override)
5.显示虚函数重载 在 C++ 里,在子类中容易意外的重载虚函数.举例来说: struct Base { virtual void some_func(); }; struct Derived : B ...
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
3.空指针(nullptr) 早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分. C 使用 preprocessor macroNULL 表示空指针, 让 NULL 及 0 分别 ...
随机推荐
- Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 # yield的表达式形式 def foo(): print('starting') while True: x=yield #默认返回为空,实际上为x=yield No ...
- 连接LilyPad之Windows平台的驱动
连接LilyPad之Windows平台的驱动 LilyPad和其他的Arduino控制板的不同之处是它是为电子织物和可穿戴设计的.那么,它的大小就必须要紧凑.所以,它并没有板载其他大多数板子都具有的U ...
- CSU - 1334 -好老师(STL-map用法)
https://cn.vjudge.net/contest/157163#problem/E #include<map> #include<queue> #include< ...
- python基础之数据类型,交互,格式化输出,基本运算符
数据类型 1.什么是数据类型? 变量值才是我们存的数据,所以数据类型指的是变量值的种类 2.为何数据要分类? 变量值是用来保存现实世界中的状态的,那么针对不同的状态,就应该用不同类型的数据去表示 3. ...
- python实现多播数据的发送和接收
在项目中,YS私有协议用到多播技术,在验证其安全特性时用到python去发送多播包,在此做个记录. 多播服务器用于向多播组发送多播数据包,其实现代码如下: #coding:utf-, import s ...
- Windows 10新增的6个快捷键:
Win+方向箭头:调整窗口贴边位置 Alt+Tab:切换窗口,按住不松时会有一个全新的界面方便你在不同的窗口间选择 Win+Tab:切换任务,这个松开后界面不会消失 Win+Ctrl+D:创建新的虚拟 ...
- linux缓存nscd
1.安装 yum -y install nscd 2.配置文件: /etc/nscd.conf 3.缓存文件:缓存DB文件在/var/db/nscd下.可以通过nscd -g查看统计的信息 4.清除 ...
- SQL性能调优基础教材
一.数据库体系结构 1. Oracle数据库和实例 数据库:物理操作系统文件或磁盘的集合. 实例:一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程 ...
- 如何使用SQLMAP绕过WAF
WAF(web应用防火墙)逐渐成为安全解决方案的标配之一.正因为有了它,许多公司甚至已经不在意web应用的漏洞.遗憾的是,并不是所有的waf都是不可绕过的!本文将向大家讲述,如何使用注入神器SQLMa ...
- go语言基础之iota枚举
1.iota (在常量的时候,当成枚举使用) 示例1 package main import "fmt" func main() { //1.iota常量自动生成器,每个一行,自动 ...