};
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();
}

2.通过R”()”的方式实现转义字符
#include
#include
#include
voidmain()
{
std::stringpath =R"( "C:\Program Files\Tencent\QQ\QQProtect\Bin\QQProtect.exe")";
//通过R"()" 括号之间去掉转义字符
system(path.c_str());
system("pause");
}
3.引用
#include
template
voidcom(Targ) //模板函数,引用无效,引用包装器
{
std::cout << "com =" << &arg << "\n";
arg++;
}
voidmain()
{
intcount = 10;
int & rcount =count;
com(count);
std::cout << count <
//std::ref(变量),函数模板,引用包装器
//com(std::ref(count));
com(rcount);
std::cout << "main=" << &rcount << "\n";
std::cout << count <
std::cin.get();
}
4.C++别名
#include
namespacespace{ //隔离模板,避免冲突
template
usingprt =T*;//模板的简写,定义一个模板的指针
}
intadd(inta,intb)
{
returna +b;
}
//typedef是C语言中定义别名的关键字
typedef int(*ADD)(inta,intb);
//C++中的别名是通过using关键字实现的
usingFUNC =int(*)(inta,intb);
usingco =std::ios_base::fmtflags;
voidmain()
{
ADDp =add;
std::cout << p(1, 2) <
FUNCfunc =add;
std::cout << func(1, 2) <
//space::ptr
pint(new int(15));
//std::cout << *pint << " " << pint << std::endl;
std::cin.get();
}

5.模板元
#include
//主要思想
//
//利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。
//
//优劣及适用情况
//
//1.以编译耗时为代价换来卓越的运行期性能(一般用于为性能要求严格的数值计算换取更高的性能)。通常来说,一个有意义的程序的运行次数(或服役时间)总是远远超过编译次数(或编译时间)。
//2.调试困难,元程序执行于编译期,没有用于单步跟踪元程序执行的调试器(用于设置断点、察看数据等)。程序员可做的只能是等待编译过程失败,然后人工破译编译器倾泻到屏幕上的错误信息。