c++模板笔记
使用vc2015
进行C++ 模板的学习实验和笔记 用简单示例学习了解STL
template大部头理论书 讲解各种规则和各种规则例外的解决办法 集中精力在20%的规则中的阴暗角落而不是80%实践中要注意的东西
https://github.com/wuye9036/CppTemplateTutorial
这个模板教程是强烈推荐 易懂 看完可用于个人的一些代码中进行模板编程 实用
第一个示例
//=============================================
int add(int a ,int b)
{
return a+b;
}
int main()
{
add(3,8);
add(7,12);
return 0;
}
//============================================
如果说
函数是变量之间的操作方式复用方案
比如 3+8 7+12 都是调用add函数
那么模板就是变量的类型的复用方案
比如
#include <iostream>
template<typename T>
const T& compare(T& a, T& b)
{
return a > b? a :b;
}
int main()
{
int a = 7, b = 8, c = 9, d = 3;
std::cout << compare<int>(a, b) << std::endl;
std::cout << compare(c, d) << std::endl;
char f = 'f', g = 'z';
std::cout << compare(f, g) << std::endl;
return 0;
}
compare这个模板函数对于变量的比较方式都是一致的 ,就是比较两个变量的大小
而且对于 int 和 char 两种变量类型的比较都适用
就是我所说的对于变量的类型的复用方案
由于模板T对应的变量类型在本例中可以从函数参数推导得出 所以<int>这个符号并不强制需要写出来。
下面示例是一个链表 链表中每个节点可以存储不同类型元素
#include <iostream>
#include <string>
template<typename TYPE,typename NEXT>
struct AnyList {
TYPE value;
NEXT* next;
AnyList(TYPE const &v,NEXT *n):value(v),next(n){}
};
int main()
{
typedef AnyList<int, void> node_0;
node_0 zero(4,NULL) ;
typedef AnyList<char, node_0> node_1;
node_1 one('z',&zero);
typedef AnyList<std::string, node_1> node_2;
node_2 two("test", &one);
std::cout << two.value << std::endl;
std::cout << one.value << std::endl;
std::cout << zero.value << std::endl;
std::cout << two.value << std::endl;
std::cout << two.next->value << std::endl;
std::cout << two.next->next->value << std::endl;
return 0;
}
示意图:略
STL中FOREACH示例学习(函数指针模板参数)
#include <iostream>
#include <string>
template<typename T,void(*f)(T &v)>
void foreach(T array[], unsigned size)
{
for (unsigned i = 0; i < size; ++i)
f(array[i]);
}
template<typename T>
void inc(T& v) { ++v; }
template<typename T>
void dec(T& v) { --v; }
template<typename T>
void print(T& v) { std::cout << ' ' << v << std::endl; }
int main()
{
int array[] = { 1,2,3,4,5,6,7,8 };
foreach<int, print<int>>(array, 8);
std::cout << std::endl;
foreach<int, inc<int>>(array, 8);
foreach<int, print<int>>(array, 8);
std::cout << std::endl;
foreach<int, dec<int>>(array, 8);
foreach<int, print<int>>(array, 8);
std::cout << std::endl;
return 0;
}
FOREACH函数从模板接收操作类型和操作函数,从参数中接收要操作的数组和数组长度
//===============================================
指针与引用模板参数
#include <iostream>
#include <string>
template<typename T>
class wrapper;
template<typename T>
class wrapper<T*> {
public:
T* p;
wrapper(T* t):p(t){}
T get() { return *p; }
void set(T v) { *p = v; }
};
template<typename T>
class wrapper<T&> {
public:
T& p;
wrapper(T& t) :p(t) {}
T get() { return p; }
void set(T v) { p = v; }
};
int global_variable_int = 0;
char global_variable_char = 'Z';
std::string global_variable_str = "this is a test";
int main()
{
wrapper<int*> gwrapper1(&global_variable_int);
gwrapper1.set(1);
std::cout << gwrapper1.get() << std::endl;
wrapper<int&> gwrapper2(global_variable_int);
gwrapper2.set(2);
std::cout << gwrapper2.get() << std::endl;
wrapper<char*> gwrapper3(&global_variable_char);
gwrapper3.set('a');
std::cout << gwrapper3.get() << std::endl;
wrapper<char&> gwrapper4(global_variable_char);
gwrapper4.set('g');
std::cout << gwrapper4.get() << std::endl;
wrapper<std::string*> gwrapper5(&global_variable_str);
std::cout << gwrapper5.get() << std::endl;
wrapper<std::string&> gwrapper6(global_variable_str);
gwrapper6.set("finish test");
std::cout << gwrapper6.get() << std::endl;
return 0;
}
根据参数的不同 自动选择不同的模板函数 指针或者引用
//======================================
模板的模板参数
如果模板中的模板不参与推导 可以省略不写
#include <iostream>
#include <string>
//template<template<typename TT> class Func, typename T>
template<template<typename> class Func, typename T>
void foreach(T array[], unsigned size)
{
Func<T> func;
for (unsigned i = 0; i < size; ++i)
func(array[i]);
}
template<typename T>
struct inc {
void operator()(T& v) { ++v; }
};
int main()
{
int arr[] = { 1,2,3,4,5 };
foreach<inc>(arr,5);
return 0;
}
//====================================================
特化匹配示例
// 11111.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
template<typename T0,typename T1,typename T2>
struct S {
std::string id() { return "General"; }
};
template<typename T0,typename T1>
struct S<T0, T1, char>
{
std::string id(){ return "#1"; }
};
template<typename T0>
struct S<T0, char, char>
{
std::string id() { return "#2"; }
};
template<typename T>
struct S<int, T, T>
{
std::string id() { return "#3"; }
};
int main()
{
std::cout << S<float, float, float>().id() << std::endl;
std::cout << S<int, int, int>().id() << std::endl;
std::cout << S<int, int, char>().id() << std::endl;
std::cout << S<char, char, char>().id() << std::endl;
// 歧义
//std::cout << S<int, char, char>().id() << std::endl;
return 0;
}
//========================================================
模板的递归示例
// 11111.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
template<int i>
int mult()
{
return i * mult<i - 1>();
}
template<>
int mult<1>()
{
return 1;
}
int main()
{
std::cout << "mult<4> = " << mult<4>();
return 0;
}
c++模板笔记的更多相关文章
- Matrix Admin 后台模板笔记
一个后台模板用久了就想换一个.上次找到了Matrix Admin.和ACE一样都是Bootstrap风格,比较容易上手.Matrix要更健壮些.感觉拿去做用户界面也是可以的. 整体风格: 1.表单验证 ...
- 【Python】Flask系列-模板笔记
Jinja2模板 Jinja2模板传参 如何渲染模板: 模板放在templates文件夹下 从flask中导入render_template函数. 在视图函数中,使用render_template函数 ...
- Thymeleaf模板笔记
1.常用标签: 使用thymeleaf模板,首要在html中引入: <html xmlns:th="http://www.thymeleaf.org"> 引入css.j ...
- QAQ数论模板笔记√
#include <cstdio> using namespace std; long long gcd(long long a, long long b) { // (a, b) ret ...
- QAQ高精度模板笔记√
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #i ...
- d3基础图形模板笔记
散点图(scatter plot): http://bl.ocks.org/weiglemc/6185069 雷达图(radar): http://xgfe.github.io/uploads/che ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- WPF,Silverlight与XAML读书笔记第四十五 - 外观效果之模板
说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 模板允许用任何东西完全替换一个元素的可视树, ...
随机推荐
- 自己动手,丰衣足食!Python3网络爬虫实战案例
本教程是崔大大的爬虫实战教程的笔记:网易云课堂 Python3+Pip环境配置 Windows下安装Python: http://www.cnblogs.com/0bug/p/8228378.html ...
- Azure Redis Cache (5) Redis Cache Cluster集群模式
<Windows Azure Platform 系列文章目录> Redis Cluster 3.0之后的版本,已经支持Redis Cluster集群模式,Redis Cluster采用无中 ...
- 黄聪:C#使用Application.Restart重启程序出错解决办法
调用 Application.Restart重启程序出错 解决办法,就是给程序的.exe文件,加上下面的设置
- 搜狗浏览器总是打开123.sogou.com-记搜狗浏览器遭遇劫持一例
昨日,因从网上下载了office2010破解工具,压缩包中有个文件为名为[office 2010激活工具\为保证永久激活,要先点击这个配置,再点击KMSELDIYI激活.exe],单击之后没有反应.后 ...
- js window.location用法
<script> //设置或获取 href 属性中跟在问号后面的部分. console.log(window.location.search)//设置或获取对象指定的文件名或路径conso ...
- python configparser使用
.ini文件由若干section(部分)组成, 而每一个section又由若干键值对组成. 以 example.ini为例: [DEFAULT] ServerAliveInterval = 45 Co ...
- k8s学习笔记之四:资源清单定义入门
第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...
- 八(第二篇)、主体结构元素——nav元素、aside元素
nav元素 nav元素是一个可以用作页面导航的链接组,其中的导航元素链接到其他页面或当前页面的其他部分. 并不是所有的链接组都要被放进nav元素,只需要将主要的.基本的链接组放进nav元素即可. na ...
- git打tag
亲们支持我的新博客哦==>地址(以后更新会尽量在新博客更新,欢迎大家访问加入我的后宫w) ) 标签分类 git标签分为两种类型:轻量标签和附注标签.轻量标签是指向提交对象的引用,附注标签 ...
- Java内存泄漏的几种可能
Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周期的对象持有短生命周期对象的引用就很可能发 ...