引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
1、引用内部函数绑定机制
#include<iostream>
#include<functional>
usingnamespacestd;
usingnamespacestd::placeholders;
//仿函数。创建一个函数指针,引用一个结构体内部或者一个类内部的共同拥有函数
structMyStruct
{
voidadd(inta)
{
cout
<<a <<endl;
}
voidadd2(inta,intb)
{
cout
<<a +b
<<endl;
}
voidadd3(inta,intb,intc)
{
cout
<<a +b
+c <<endl;
}
};
voidmain()
{
MyStructstruct1;
//auto自己主动变量。地址,函数指针,bind绑定
//第一个參数引用内部函数,绑定一个实体对象
//这里后面的_1等为占位用
autofunc
=bind(&MyStruct::add,
&struct1,_1);
autofunc2
=bind(&MyStruct::add2,
&struct1,_1,_2);
autofunc3
=bind(&MyStruct::add3,
&struct1,_1,_2,_3);
func(100);
func2(10,
20);
func3(10,
20, 30);
cin.get();
}
voidmain1()
{
//假设想通过第二种方式获得结构体中的函数,还能够通过以下的方式
MyStructstruct1;
//创建函数指针。类结构体,数据私有,代码共享
//函数通过调用,调用须要传递对象名进行区分
void(MyStruct::*p)(inta)
= &MyStruct::add;
cin.get();
}
补充:Cocos2dx中关于std::function和bind的使用方法案例:
|
#include void { CCLog("foo is called\n"); } void { CCLog("%d,%c,%f",n,c,f); } void { CCLog("mFoo is called"); } //关于lambda表达式 bool { Layer::init(); //std::function; //std::bind //函数指针类型 std::function<void()> func(); //成员函数指针的赋值和调用 { //注意在::域作用符后面加上* void(T01CPP11::*FuncPtr)() = &T01CPP11::mFoo; //调用成员函数的时候加上this (this->*FuncPtr)(); } //bind的功能,就是把一个详细函数,编程std::function对象 //bind能够把详细函数和std::function形式全然改变,比方參数数量的改变 { std::function<void()> func(); } //也能够改变參数顺序 { //当中 //_1:表示function<void(float, char, int)>括号里的第一个參数 //_2:表示function<void(float, char, int)>括号里的第二个參数 //_3:表示function<void(float, char, int)>括号里的第三个參数 //后面3个占位符分别在funArg3中的顺序,而又用标记来代表上面括号里參数的的位置 std::function<void(float, std::placeholders::_3, func(1.0f, } // 也能够同一时候改变參数个数和顺序 { std::function<void(float, 100, std::placeholders::_2, func(4.0f, } //也能够绑定成员函数 { std::function<void()> func(); } return } |
2.通过R”()”的方式实现转义字符
#include<iostream>
#include<string>
#include<stdlib.h>
voidmain()
{
std::stringpath
=R"( "C:\Program Files\Tencent\QQ\QQProtect\Bin\QQProtect.exe")";
//通过R"()" 括号之间去掉转义字符
system(path.c_str());
system("pause");
}
3.引用
#include<iostream>
template<classT>
voidcom(Targ) //模板函数,引用无效,引用包装器
{
std::cout
<< "com =" << &arg
<< "\n";
arg++;
}
voidmain()
{
intcount
= 10;
int &rcount
=count;
com(count);
std::cout
<< count <<std::endl;
//std::ref(变量),函数模板,引用包装器
//com(std::ref(count));
com(rcount);
std::cout
<< "main=" << &rcount
<< "\n";
std::cout
<< count <<std::endl;
std::cin.get();
}
4.C++别名
#include<iostream>
namespacespace{ //隔离模板,避免冲突
template<classT>usingprt
=T*;//模板的简写,定义一个模板的指针
}
intadd(inta,intb)
{
returna
+b;
}
//typedef是C语言中定义别名的keyword
typedef int(*ADD)(inta,intb);
//C++中的别名是通过usingkeyword实现的
usingFUNC
=int(*)(inta,intb);
usingco
=std::ios_base::fmtflags;
voidmain()
{
ADDp
=add;
std::cout
<< p(1, 2) <<std::endl;
FUNCfunc
=add;
std::cout
<< func(1, 2) <<std::endl;
//space::ptr<int> pint(new int(15));
//std::cout << *pint << " "
<< pint << std::endl;
std::cin.get();
}
5.模板元
#include<iostream>
//主要思想
//
//利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释运行。
//
//优劣及适用情况
//
//通过将计算从执行期转移至编译期,在结果程序启动之前做尽可能多的工作,终于获得速度更快的程序。也就是说模板元编程的优势在于:
//
//1.以编译耗时为代价换来卓越的执行期性能(一般用于为性能要求严格的数值计算换取更高的性能)。
通常来说。一个有意义的程序的执行次数(或服役时间)总是远远超过编译次数(或编译时间)。
//
//2.提供编译期类型计算。通常这才是模板元编程大放异彩的地方。
//
//模板元编程技术并不是都是长处:
//
//1.代码可读性差。以类模板的方式描写叙述算法或许有点抽象。
//
//2.调试困难,元程序运行于编译期,没实用于单步跟踪元程序运行的调试器(用于设置断点、察看数据等)。程序猿可做的仅仅能是等待编译过程失败。然后人工破译编译器倾泻到屏幕上的错误信息。
//
//3.编译时间长。通常带有模板元程序的程序生成的代码尺寸要比普通程序的大。
//
//4.可移植性较差,对于模板元编程使用的高级模板特性。不同的编译器的支持度不同。
//模板元吧执行时消耗的时间,在编译期间优化
template<intN>
structdata
{
enum
{res =data<N
- 1>::res +data<N
- 2>::res };
};
//当为1的情况
template<>
structdata<1>
{
enum
{res = 1};
};
template<>
structdata<2>
{
enum
{res = 1 };
};
intgetdata(intn)
{
if
(n == 1 ||n
== 2)
{
return
1;
}
else
{
returngetdata(n
- 1) + getdata(n
- 2);
}
}
voidmain()
{
constintmyint
= 40;
intnum
=data<myint>::res;//<>内部不能够有变量
std::cout
<< num <<std::endl;
std::cout
<< getdata(40) <<std::endl;
std::cin.get();
}
执行结果同样。可是后者明显速度要慢于前者。
6.宏
#include<stdio.h>
#include<assert.h>
#include<iostream>
usingnamespacestd;
#define N
10
voidmain()
{
intnum
= 100;
cout
<<num <<endl;
//本文件所在的文件路径
cout
<<__FILE__ <<endl;
//下一行代码在文件里的行位置
cout
<<__LINE__ <<endl;
//日期
cout
<<__DATE__ <<endl;
//日期
cout
<<__TIME__ <<endl;
//当前函数名称
cout
<< __FUNCTION__ <<endl;
cin.get();
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
7.断言调试
这时候没有输入东西
8.C++中的多线程
#include<thread>
#include<iostream>
#include<windows.h>
#include<vector>
usingnamespacestd;
usingnamespacestd::this_thread;
voidmsg()
{
MessageBoxA(0,"12345","678910",0);
}
voidmsgA(intnum)
{
std::cout
<< get_id() <<"
num = " <<num
<<std::endl;
}
voidmain()
{
// thread::hardware_concurrency线程
auton
=thread::hardware_concurrency();//获得当前核心数
std::cout
<< n <<std::endl;
//获取当前线程编号
std::cout
<< "thread = " <<get_id()
<<std::endl;
threadthread1(msg);//创建多线程
threadthread2(msg);
thread1.join();//開始运行
thread2.join();
std::cin.get();
}
截图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
9.多线程
#include<thread>
#include<iostream>
#include<windows.h>
#include<vector>
usingnamespacestd;
usingnamespacestd::this_thread;
voidmsg()
{
MessageBoxA(0,"12345","678910",0);
}
voidmsgA(intnum)
{
std::cout
<< get_id() <<"
num = " <<num
<<std::endl;
}
voidmain()
{
vector<thread
*> threads;
for
(inti
= 0;i < 10;i++)
{
threads.push_back(newthread(msg));//创建线程
}
for
(autoth
:threads)
{
th->join();
}
std::cin.get();
}
10.线程间通信
#include<thread>
#include<iostream>
#include<windows.h>
#include<vector>
usingnamespacestd;
usingnamespacestd::this_thread;
voidmsgA(intnum)
{
std::cout
<< get_id() <<"
num = " <<num
<<std::endl;
}
voidmain()
{
vector<thread
*> threads;
for
(inti
= 0;i < 10;i++)
{
//当中后面的msgA为函数名。i为为函数传递的參数
threads.push_back(newthread(msgA,i));//创建线程
}
for
(autoth
:threads)
{
th->join();
}
std::cin.get();
}
程序执行结果例如以下:
11.C++中的智能指针
#include<iostream>
#include<memory>//内存
voidmain()
{
for
(inti
= 0;i < 10000000;i++)
{
//新型指针,新型的数组
std::unique_ptr<double>pdb(newdouble);
//通过指针运行来自己主动释放内存
//double *p = new double;
}
std::cin.get();
}
12.第二种智能指针
#include<iostream>
voidmain()
{
//auto_prt
for
(inti
= 0;i < 10000000;i++)
{
double
*p =newdouble;//为指针分配内存
std::auto_ptr<double>autop(p);
//创建智能指针管理指针p指向内存
//智能指针
//delete p;
}
std::cin.get();
}
引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针的更多相关文章
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- 第22课 weak_ptr弱引用智能指针
一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...
- 记录Java的垃圾回收机制和几种引用
一.Java的垃圾回收机制 Java的垃圾回收机制(java garbage collection)是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的堆内存空间. ...
- Android 如何引用com.android.internal.R目录下的资源
Android 如何引用com.android.internal.R目录下的资源 项目需求 有一个资源跟系统上的一个资源相同,想要引用它:frameworks/base/core/res/res/dr ...
- php的变量引用与销毁机制
在php中,符号"&"表示引用. 1.看看不引用的情况是这样子: $a = "hello world";//定义一个变量,下面赋值给$b $b = $ ...
- C++智能指针之shared_ptr与右值引用(详细)
1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...
- Item 25: 对右值引用使用std::move,对universal引用则使用std::forward
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...
- Angularjs 双向绑定机制解析
文章转自:http://www.2cto.com/kf/201408/327594.html AngularJs 的元素与模型双向绑定依赖于循环检测它们之间的值,这种做法叫做脏检测,这几天研究了一下其 ...
- 关于jQuery新的事件绑定机制on()的使用技巧
关于jQuery新的事件绑定机制on()的使用技巧 http://www.jb51.net/article/36064.htm 本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要 ...
随机推荐
- JavaScript:Browser 对象
ylbtech-JavaScript:Browser 对象 1. Window 对象返回顶部 1. Window 对象 Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框 ...
- ClassLoader.getResourceAsStream(name);获取配置文件的方法
ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+" ...
- php auto_load mvc 接口框架(原创)
autoload.php <?php function framework_autoload($className){ $className=str_replace('\\','/',$clas ...
- 27. Remove Element[E]移除元素
题目 Given an array nums and a value val, remove all instances of that value in-place and return the n ...
- Springboot使用AOP实现统一处理Web请求日志
1.要使我们自定义的记录日志能够打印出来,我们需要先排除springboot默认的记录日志,添加如下的设置 2.新建 resources/log4j.properties 我的设置为: # LOG4J ...
- 利用网络Socket和多线程实现一个双向聊天
接收键盘输入然后向对方发送消息的线程 package cn.com.chat; import java.io.BufferedReader; import java.io.BufferedWriter ...
- (转)ORA-01502
问题:ora-01502 索引或这类索引的分区处于不可用状态 引发:移动数据表分区,导致索引失效 解决:重建失效索引 1. select index_name ,status from user_i ...
- 使用Storm实现实时大数据分析!
随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战.Shruthi Kumar和Siddharth Patankar在Dr.Dobb's上结合了汽车超速监视,为我们演示了使用Storm进 ...
- 搞不懂的算法-排序篇<1>
最近在学习算法,跟着<Algorithms>这本书,可能是自己水平不够吧,看完排序算法后各种,希尔,归并,快排,堆的实现在脑子里乱成一锅粥,所以就打算大概总结一下,不求精确,全面,只想用平 ...
- 如何用npm安装vue
下载安装node.js,安装完毕做好配置后开始运行. 如果npm版本太低,需要升级一下npm # 查看版本 $ npm -v #升级 npm cnpm install npm -g 安装vue-cli ...