【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert

引用包装器  std::ref(变量)

#include<iostream>

template<class T>
void com(T arg)//模板函数,引用无效,引用包装器
{
	std::cout <<"com ="<< &arg << "\n";
	arg++;
}

void main()
{
	int count = 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();
}

仿函数

引用内部函数绑定机制

#include<iostream>
#include<functional>//处理函数

using namespace std;
using namespace std::placeholders;

//仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的公有函数
struct MyStruct
{
	void add(int a)
	{
		cout << a << endl;
	}
	void add2(int a,int b)
	{
		cout << a +b<< endl;
	}
	void add3(int a, int b,int c)
	{
		cout << a + b +c<< endl;
	}
};

void main()
{
	MyStruct struct1;
	//创建函数指针,类结构体,数据私有,代码共享
	//函数通过调用,调用需要传递对象名进行区分
	void(MyStruct::*p)(int ) = &MyStruct::add;
	cin.get();
}

int main1()
{
	MyStruct struct1;
	//auto自动变量,地址,函数指针,bind绑定
	//第一个参数引用内部函数,绑定一个实体对象,
	auto func = bind(&MyStruct::add, &struct1, _1);//一个参数
	auto func2 = bind(&MyStruct::add2, &struct1,_1, _2);//二个参数
	auto func3 = bind(&MyStruct::add3, &struct1, _1, _2,_3);//三个参数
	func(100);
	func2(10, 20);
	func2(10, 20, 30);//只会接收前2个参数
	func3(10, 20,30);
	cin.get();

	return 0;
}

转义字符 R”()”

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

void main()
{
	std::string path =R"( "C:\Program Files\Tencent\QQ\QQProtect\Bin\QQProtect.exe")";
	//R"()"   括号之间去掉转义字符
 	system(path.c_str());
	system("pause");

}

using别名

#include <iostream>

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

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

typedef  int(*ADD)(int a, int b);
using  FUNC = int (*)(int a, int b);//别名
using  co = std::ios_base::fmtflags;//using只可以用于简写数据类型

void main()
{
	ADD p=add;
	std::cout<<p(1, 2)<<std::endl;
	FUNC func = add;
	std::cout << func(1, 2) << std::endl;
	//space::ptr<int> pint(new int(15));
	//std::cout << *pint << "   " << pint << std::endl;

	std::cin.get();
}

模板元编程 比递归优化

#include<iostream>
//模板元把运行时消耗的时间,在编译期间优化

template<int N>
struct data
{
	enum {res =data<N-1>::res+data<N-2>::res};
};

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

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

//递归 斐波那契数列
//1  1  2  3  5  8
int getdata(int n)
{
	if (n==1 || n==2)
	{
		return 1;
	}
	else
	{
		return getdata(n - 1) + getdata(n - 2);
	}
}

void main()
{
	const int myint = 40;
	int num = data<myint>::res;//<>内部不可以有变量
	std::cout << num << std::endl;

	std::cout << getdata(40) << std::endl;

	std::cin.get();
}
//主要思想
//
//利用模板特化机制实现编译期条件选择结构,利用递归模板实现编译期循环结构,模板元程序则由编译器在编译期解释执行。
//
//优劣及适用情况
//
//通过将计算从运行期转移至编译期,在结果程序启动之前做尽可能多的工作,最终获得速度更快的程序。也就是说模板元编程的优势在于:
//
//1.以编译耗时为代价换来卓越的运行期性能(一般用于为性能要求严格的数值计算换取更高的性能)。通常来说,一个有意义的程序的运行次数(或服役时间)总是远远超过编译次数(或编译时间)。
//
//2.提供编译期类型计算,通常这才是模板元编程大放异彩的地方。
//
//模板元编程技术并非都是优点:
//
//1.代码可读性差,以类模板的方式描述算法也许有点抽象。
//
//2.调试困难,元程序执行于编译期,没有用于单步跟踪元程序执行的调试器(用于设置断点、察看数据等)。程序员可做的只能是等待编译过程失败,然后人工破译编译器倾泻到屏幕上的错误信息。
//
//3.编译时间长,通常带有模板元程序的程序生成的代码尺寸要比普通程序的大,
//
//4.可移植性较差,对于模板元编程使用的高级模板特性,不同的编译器的支持度不同。

智能指针

#include <iostream>

void main1()
{
	//auto_ptr;
	for (int i = 0; i < 10000000; i++)
	{
		double *p = new double;//为指针分配内存
		std::auto_ptr<double> autop(p);
		//创建智能指针管理指针p指向内存
		//智能指针
		//delete p;
	}

	std::cin.get();
}

C++11智能指针

#include<iostream>
#include<memory>//内存

void main()
{
	for (int i = 0; i < 10000000;i++)
    {
		//新型指针,新型的数组
		std::unique_ptr<double> pdb(new double);
		//double *p = new double;
    }

	std::cin.get();
}

多线程

#include <thread>
#include<iostream>
#include<windows.h>
#include<vector>

using namespace std;
using namespace std::this_thread;

void msg()
{
	MessageBoxA(0, "12345", "678910", 0);
}

void msgA(int num)
{
	std::cout << get_id() << "  num=   " << num << std::endl;
}

void main1()
{
	// thread::hardware_concurrency线程
	auto n = thread::hardware_concurrency();
	std::cout << n << std::endl;
	//获取当前线程编号
	std::cout << "thread=" << get_id() << std::endl;

   thread thread1(msg);//创建多线程
   thread thread2(msg);
   thread1.join();//开始执行
   thread2.join();

	std::cin.get();
}

void main2()
{
	vector<thread *> threads;
	for (int i = 0; i < 10; i++)
	{
		threads.push_back(new thread(msg));//创建线程
	}

	for (auto th : threads)
	{
		th->join();
	}

	std::cin.get();
}

void main()
{
	vector<thread *> threads;
	for (int i = 0; i < 10; i++)
	{
		threads.push_back(new thread(msgA,i));//创建线程
	}

	for (auto th : threads)
	{
		th->join();
	}

	std::cin.get();
}

静态断言以及调试技能的要求 assert

#include <stdio.h>
#include<assert.h>
#include<iostream>

using namespace std;
#define  N 10

void main()
{
	int num = 100;
	cout << num << endl;
	cout << __FILE__ << endl;
	cout << __LINE__ << endl;
	cout << __DATE__ << endl;
	cout << __TIME__ << endl;
	cout << __FUNCTION__ << endl;

	cin.get();
}

#define M
void main1()
{
   char  num = 10;
   static_assert(sizeof(num) >= 1,"num valiued");

   assert(num >= 4,"num>4");
	//字节>4
#ifdef  M
  // static_assert(sizeof(num) >= 4, "yincheng error");
#endif

	//调试代码,迅速代码错误在哪一行
}
时间: 2024-09-15 09:37:33

【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert的相关文章

引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

 1.引用内部函数绑定机制 #include<iostream> #include<functional>   usingnamespacestd; usingnamespacestd::placeholders;   //仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的共有函数 structMyStruct {    voidadd(inta)    {        cout <<a <<endl;    }    voidadd2(in

C++引用计数的智能指针有效回收方法

引用计数指针是否能有效地回收,对系统意外关机之后数据的恢复来说至关重要,关键是要避免对象复制. 怎样从灾难性故障中,恢复一个长期运行.系统级的后台守护进程或者服务,在如今的软件设计过程中,已成为了一个重要的考虑因素.当这些软件是由C++语言编成,并使用了引用计数的智能指针时,那么,智能指针的有效回收,对系统是否具有可伸缩级的恢复能力.甚至正确地继续未完成的操作来说,都显得至关重要. 在本文中,描述了一种方法,可从关机之后的软件恢复中,有效地回收引用计数指针,而且此方法在内存占用方面也非常高效,这

【C/C++学院】0815-函数包装器/CPP类型转换/函数模块/动态数组

函数包装器管理内嵌函数 #include<iostream> #include<functional> //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部函数调用 //函数包装器, T数据类型, F是函数 template<typename T,typename F> T run(T v, F f) { stati

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

《jQuery Cookbook中文版》——1.6 查找当前选择包装器集中的后代元素

1.6 查找当前选择包装器集中的后代元素 1.6.1 问题你选择了一组(或者一个)DOM元素,希望在当前选中元素的上下文中找到后代(子)元素. 1.6.2 解决方案使用.find()方法,根据当前集合及其后代的上下文创建一个新的元素包装器集.例如,假设你有一个包含多个段落的网页,这些段落中封装的是需要强调(以斜体显示)的单词.如果你只想选择 元素中包含的元素,可以使用如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona

函数包装器,函数私有类处理

 1.函数包装器 #include<iostream> #include<functional>   //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部函数调用   //函数包装器, T数据类型, F是函数 template<typename T, typename F> T run(T v, F f) {  

如何编写 Spring Roo 的高级附加组件和包装器附加组件

本系列 "Spring Roo 简介" 的 Spring Roo 简介,第 3 部分:开发 Spring Roo 的附加组件 讨论了 Spring Roo 附 加架构,以及如何使用 addon create 命令创建国际化的.简单的附加组件.本文主要关注 Spring Roo 支持的其余两种类 型的附加组件,即高级附加组件和包装器附加组件.建议您在开始阅读本文之前先阅读第 3 部分的文章. 高级附加 组件的简介 高级附加组件允许 Spring Roo 执行简单附加组件所能执行的一切操作

IBM InfoSphere Federation Server V9.7中JDBC包装器的应用

联邦数据库的基本概念 联邦数据库是一个特殊的分布式数据管理系统,它是由一组数据源组成,其中由一个 DB2 数据库担当联邦服务器,对其他的数据源的操作都可以看作是在服务器上进行,并且这些通过联邦系统对其他数据源的操作不会影响这些数据源各自的独立性和完整性. 联邦数据库具有以下特点: 透明性:底层的多个数据源对用户而言是透明的,所有的对这些数据源的操作都像是在一个 DB2 数据库中进行的. 异构性:可以满足企业环境下不同的数据以及数据源需求. 扩展性:联邦数据库提供了一些接口,可以通过实现这些接口灵

Java千百问_06数据结构(003)_什么是基本类型包装器

1.什么是包装器 包装器也叫包装类,继承于Object,可以当作8种基本数据类型的类映射,包装器可以直接转换为基本数据类型(成为拆箱).如下:  了解8种基本数据类型看这里:java有哪8种基本数据类型 2.包装器有什么作用 包装器描述了基本数据类型的若干属性,包括基本类型的取值范围以及长度等.  例子: public class PrimitiveTypeTest { public static void main(String[] args) { // byte System.out.pri