巩固C++(一)----R"()"去转移字符 & 绑定bind & 模板元编程

一 R"()"去掉字符串中的转移字符

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<stdlib.h>
#include<string>

int main()
{
	std::string str = R"("C:\Users\Administrator\Desktop\test.txt")";
	std::cout << str << std::endl;
	//R"()"去掉转义字符,使之能像正常字符串一样处理转义字符
	system(str.c_str());
	//将字符串作为样式的c.,Null终止的字符串的内容。
	//const value_type *c_str( ) const;
	//对调用的字符串的C样式版本的指针。 指针值在调用一个非常量函数后无效,包括析构函数,在对象的basic_string的选件类。




	system("pause");
	return 0;
}
运行结果:

打开test.txt并输出

"C:\Users\Administrator\Desktop\test.txt"
请按任意键继续. . .

2 绑定 & 引用包装器std::ref()


#include<iostream>
#include<functional>	//函数处理函数,包含bind和ref函数

using std::cout;
using std::endl;
using std::ostream;
using std::placeholders::_1;
using std::placeholders::_2;

void func(int a, int b)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

ostream &print(ostream &os, int a)
{
	os << "a = " << a << endl;

	return os;
}

struct MyStruct{
	void add(int a, int b)
	{
		cout << "struct a = " << a << endl;
		cout << "struct b = " << b << endl;
	}
};

int main()
{
	auto myFunc = bind(func, _1, 10);
	myFunc(100);
	cout << endl;

	//可以由占位符重新安排参数的位置
	auto myFunc2 = bind(func, _2, _1);
	myFunc2(1, 2);
	cout << endl;

	//arg_list的顺序必须和函数func参数顺序一致,只需要将替换的参数用占位符代替即可
	//传递给myFunc3参数的顺序由占位符决定,其他不是占位符的参数是拷贝到bind绑定的对象中的
	//有些参数无法拷贝,如输入输出流,这时候只能用标准库ref函数
	auto myFunc3 = bind(func, 1, _1);
	myFunc3(2);
	cout << endl;

	//这时候绑定的第一个参数必须使用引用的形式,函数ref返回一个对象,包含给定的引用,此对象是可以拷贝的
	auto myFunc4 = bind(print, std::ref(cout), _1);
	myFunc4(123);
	cout << endl;

	//绑定结构体重的函数
	MyStruct str2;
	//bind第一个参数必须是一个函数的地址,而对于struct而言,需要借助一个实体,即str2
	auto myFunc5 = bind(&MyStruct::add, &str2, _1, 111);//相当于一个函数指针
	myFunc5(555);
	cout << endl;

	//结构体内函数指针使用方式
	//函数是共享的,单函数里边的数据是函数所独有的,函数指针必须制定类,要不然无法使用函数内部的数据,因为数据是私有的
	//函数通过调用,调用需要绑定类,也就是说制定类
	void(MyStruct::*p)(int a, int b) = &MyStruct::add;
	MyStruct stu3;
	stu3.add(999, 888);
	

	system("pause");
	return 0;
}



运行结果:
a = 100
b = 10

a = 2
b = 1

a = 1
b = 2

a = 123

struct a = 555
struct b = 111

struct a = 999
struct b = 888
请按任意键继续. . .

练习1:

给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值
#include<iostream>
#include<string>
#include<functional>
#include<algorithm>
#include<vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::ref;

inline bool check(const string &s, string::size_type n)
{
	return n > s.size();
}

inline vector<int>::const_iterator find_first_bigger(vector<int> &vec, const string &s)
{
	return find_if(vec.cbegin(), vec.cend(), bind(check, s, std::placeholders::_1));
	
}

int main()
{
	vector<int> vec = { 1, 1, 2, 3, 4, 5, 6, 7, 8 };
	string str = "Apple";
	
	cout << *find_first_bigger(vec, str) << endl;

	system("pause");
	return 0;
}
运行结果:
6
请按任意键继续. . .

练习2:

把上体中vector中的内容改成string类型会怎么样呢?
试着写出来吧。。。



3 类型别名 using

#include<iostream>
#include<stdlib.h>

int add(int a, int b)
{
	return a + b;
}

typedef int(*ADD)(int a, int b);		//函数指针别名
using myADD = int(*)(int a, int b);		//函数指针别名,尽量使用using

namespace space							//隔离模板,避免冲突
{		
	template<class T> using ptr = T*;	//模板别名,模板的简写
}

int main()
{
	ADD p = add;
	std::cout << p(1, 2) << std::endl;

	myADD pp = add;
	std::cout << pp(3, 2) << std::endl;

	space::ptr<int> pint(new int(15));
	std::cout << *pint << std::endl;

	
	system("pause");
	return 0;
}

运行结果:
3
5
15
请按任意键继续. . .

在C++中一般都会用using来代替C语言中的typedef...


4 模板元编程


#include<iostream>
#include<stdlib.h>

//模板元编程占用编译期时间,运行期间不占用时间

template<unsigned N>
struct data
{
	//enum中res不用重新定义
	enum{ res = data<N - 1>::res + data<N - 2>::res };
};

template<>
struct data < 1 >
{
	enum{ res = 1 };
};

template<>
struct data < 2 >
{
	enum { res = 1 };
};

int getdata(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else
		return getdata(n - 1) + getdata(n - 2);
}

int main()
{
	int num = data<40>::res;	//尖括号中只能用常量,因为变量存储在内存中,而编译时不读取内存值
	std::cout << num << std::endl;

	int num2 =getdata(40);
	std::cout << num2 << std::endl;

	system("pause");
	return 0;
}

两个函数实现的功能是一样的!但是模板元占用的是编译时间,而普通的递归函数占用的是执行时间。因此,当函数启动后,模板元的速率特别高!

有关模板元变成的详细内容请参考 <http://blog.jobbole.com/83461/>C++模板元编程

你可能感兴趣的:(C++,绑定,转义字符,引用,模板元编程)