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
"T01CPP11.h"

void
foo()

{

CCLog("foo is called\n");

}

void
funArg3(int n,char
c,float
f)

{

CCLog("%d,%c,%f",n,c,f);

}

void
T01CPP11::mFoo()

{

CCLog("mFoo is called");

}

//关于lambda表达式

bool
T01CPP11::init()

{

Layer::init();

//std::function;

//std::bind

//函数指针类型

std::function<void()>
func = foo;

func();

//成员函数指针的赋值和调用

{

//注意在::域作用符后面加上*

void(T01CPP11::*FuncPtr)() = &T01CPP11::mFoo;

//调用成员函数的时候加上this

(this->*FuncPtr)();

}

//bind的功能,就是把一个详细函数,编程std::function对象

//bind能够把详细函数和std::function形式全然改变,比方參数数量的改变

{

std::function<void()>
func = std::bind(funArg3, 100,
'c', 0.1f);

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,
char, int)>
func = std::bind(funArg3,

std::placeholders::_3,
std::placeholders::_2,
std::placeholders::_1);

func(1.0f,
'd', 2000);

}

// 也能够同一时候改变參数个数和顺序

{

std::function<void(float,
char)> func =
std::bind(funArg3,

100, std::placeholders::_2,
std::placeholders::_1);

func(4.0f,
'x');

}

//也能够绑定成员函数

{

std::function<void()>
func = std::bind(&T01CPP11::mFoo,
this);

func();

}

return
true;

}

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++智能指针的更多相关文章

  1. C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...

  2. 第22课 weak_ptr弱引用智能指针

    一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...

  3. 记录Java的垃圾回收机制和几种引用

    一.Java的垃圾回收机制 Java的垃圾回收机制(java garbage collection)是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的堆内存空间. ...

  4. Android 如何引用com.android.internal.R目录下的资源

    Android 如何引用com.android.internal.R目录下的资源 项目需求 有一个资源跟系统上的一个资源相同,想要引用它:frameworks/base/core/res/res/dr ...

  5. php的变量引用与销毁机制

    在php中,符号"&"表示引用. 1.看看不引用的情况是这样子: $a  = "hello world";//定义一个变量,下面赋值给$b $b = $ ...

  6. C++智能指针之shared_ptr与右值引用(详细)

    1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...

  7. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...

  8. Angularjs 双向绑定机制解析

    文章转自:http://www.2cto.com/kf/201408/327594.html AngularJs 的元素与模型双向绑定依赖于循环检测它们之间的值,这种做法叫做脏检测,这几天研究了一下其 ...

  9. 关于jQuery新的事件绑定机制on()的使用技巧

    关于jQuery新的事件绑定机制on()的使用技巧 http://www.jb51.net/article/36064.htm 本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要 ...

随机推荐

  1. POJ3614 Sunscreen 贪心入门

    题目大意 给出一些区间和一些点,一个点如果在一个区间内,那么此两者可以匹配.问匹配数最大是多少. 题解 这样的题我们一般都是站在区间上去找与其配对的点.我们可以得到如下性质: 对于一段区间\([l_1 ...

  2. 简单list转化为tree结构

    1 @Override public List<Module> getTree() { List<Module> list = moduleMapper.queryList() ...

  3. 深入Session

    早上考虑Spring MVC和Structs2项目共用时看到一个问题,如何保持session一致?Session是怎么样被服务器处理的呢,Spring MVC中是如何封装处理Session并在不同请求 ...

  4. js设计模式-桥接模式

    桥接模式定义:桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话有三个关键词,也就是抽象化.实现化和 ...

  5. Python基础:lambda 匿名函数

    格式 lambda argument1, argument2,... argumentN : expression square = lambda x: x**2 print(square(2)) 与 ...

  6. canvas动画简单操作

    canvas动画 小球滚动效果 关键api: window.requestAnimationFrame(draw) 会递归调用draw函数,替代setInterval var x = 20; var ...

  7. 【技术累积】【点】【java】【6】时间戳

    闲聊 加班多诶,写博客诶. 基本 时间戳,直观理解就是时间上面盖个戳罢了,在时间这个轴上面记录个点: unix时间戳表示从开始的时间点开始,经过了多少秒: 可以简单的看做是一个计时器: 基本定义可以直 ...

  8. 初步学习Axure---整理了一下自己两周的学习成果:动态面板

    自己无意间发现了做原型设计的工具--Axure,所以就自学了一点皮毛.最近时间比较充裕,就把自己现学现卖的东西整一整. 作品比较简单,没有技术可言,根据用户和开发需求,利用动态面板和一些点击事件完成了 ...

  9. C# 获得指定路径扩展名 , 去除扩展名

    //指定扩展名的文件 private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; st ...

  10. System.Windows.Forms.WebBrowser中 处理 js 脚本 window.Open 禁止新建窗口 的方法

    wb 是 拖放在窗体上的 System.Windows.Forms.WebBrowser 在你的窗体代码中定义 SHDocVw.WebBrowser_V1 wb1; 在 你窗体的 load 事件中 加 ...