c++primer记录(二) 模板
因为看得源码里有大量的类模板,所以补充下C++中模板的知识 模板:函数模板 类模板 、p- 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出; p- 非类型模板实参必须时编译时常量表达式,例:
template <int hi, int wid>
class Screen
{
public:
Screen(int vhi, int vwid){}
};
====>Screen<, > hp2621; 、对于类模板,在外部实现成员函数时,需要加上 //非特化 p-548
template < typename Type >
class COMPARE
{
public:
COMPARE(const Type&);
};
template < typename Type >
COMPARE<Type>::COMPARE(const Type& value){} //特化模板 p-568
template <>
class COMPARE<const char*>
{
public:
COMPARE(void);
};
COMPARE<const char*>::COMPARE(const char* const& value){} //特化成员函数 p-569
template <>
COMPARE<const char*>::COMPARE(const char* const& value){} 、类模板中的友员声明
第一种:
()非模板类 p-
()非模板函数 p-
template <typename Type>
class Bar
{
friend class FooBar; //(1)非模板类
friend void fcn(); //(2)非模板函数
}; 第二种:
()一般类模板 p-
()一般函数模板 p-
()类模板的特定实例 p-
()函数模板的特定实例 p-
---------------------------------------------------------------------------
()()
template <typename Type>
class Bar
{
template <typename T> friend class Foo1; //(1)一般模板类
template <typename T> friend void temp1_fcn1(const T&); //(2)一般函数模板
};
---------------------------------------------------------------------------
---------------------------------------------------------------------------
()()
template <typename T> class Foo2; //类模板声明
template <typename T> void temp1_fcn2(const T&);//函数模板声明
template <typename Type>
class Bar
{
friend class Foo2<char*>;
friend void temp1_fnc2<char*>(char* const &);
}; 、成员模板
当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板
成员模板不能为需函数(为验证) 、函数模板的特化
template < typename Type >
int compare(const Type &v1, const Type &v2)
{
return v1 < v2;
}
//特化函数模板
//声明
template <>
int compare<const char*>(const char* const& v1, const char* const& v2);
//实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了
template <>
int compare<const char*>(const char* const& v1, const char* const& v2)
{
std::cout << "speci " << v1 << " " << v2 << std::endl;
// return v1 > v2;
return strcmp(v1, v2);
} 、类模板的部分特化(此记录未验证)
如果类模板有一个以上的模板形参,若只需特化某些模板形参而非全部
template < typename T1, typename T2>
class some_template
{
}; //类模板部分特化
template < typename T1 >
class some_template<T1, int>
{
}; some_template<int, string>foo; //use template;
some_tempalte<string, int>bar; //use partial specialization
部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
实例化类模板部分特化的成员
因为看得源码里有大量的类模板,所以补充下C++中模板的知识 模板:函数模板 类模板 、p- 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出; p- 非类型模板实参必须时编译时常量表达式,例:
template <int hi, int wid>
class Screen
{
public:
Screen(int vhi, int vwid){}
};
====>Screen<, > hp2621; 、对于类模板,在外部实现成员函数时,需要加上 //非特化 p-548
template < typename Type >
class COMPARE
{
public:
COMPARE(const Type&);
};
template < typename Type >
COMPARE<Type>::COMPARE(const Type& value){} //特化模板 p-568
template <>
class COMPARE<const char*>
{
public:
COMPARE(void);
};
COMPARE<const char*>::COMPARE(const char* const& value){} //特化成员函数 p-569
template <>
COMPARE<const char*>::COMPARE(const char* const& value){} 、类模板中的友员声明
第一种:
()非模板类 p-
()非模板函数 p-
template <typename Type>
class Bar
{
friend class FooBar; //(1)非模板类
friend void fcn(); //(2)非模板函数
}; 第二种:
()一般类模板 p-
()一般函数模板 p-
()类模板的特定实例 p-
()函数模板的特定实例 p-
---------------------------------------------------------------------------
()()
template <typename Type>
class Bar
{
template <typename T> friend class Foo1; //(1)一般模板类
template <typename T> friend void temp1_fcn1(const T&); //(2)一般函数模板
};
---------------------------------------------------------------------------
---------------------------------------------------------------------------
()()
template <typename T> class Foo2; //类模板声明
template <typename T> void temp1_fcn2(const T&);//函数模板声明
template <typename Type>
class Bar
{
friend class Foo2<char*>;
friend void temp1_fnc2<char*>(char* const &);
}; 、成员模板
当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板
成员模板不能为需函数(为验证) 、函数模板的特化
template < typename Type >
int compare(const Type &v1, const Type &v2)
{
return v1 < v2;
}
//特化函数模板
//声明
template <>
int compare<const char*>(const char* const& v1, const char* const& v2);
//实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了
template <>
int compare<const char*>(const char* const& v1, const char* const& v2)
{
std::cout << "speci " << v1 << " " << v2 << std::endl;
// return v1 > v2;
return strcmp(v1, v2);
} 、类模板的部分特化(此记录未验证)
如果类模板有一个以上的模板形参,若只需特化某些模板形参而非全部
template < typename T1, typename T2>
class some_template
{
}; //类模板部分特化
template < typename T1 >
class some_template<T1, int>
{
}; some_template<int, string>foo; //use template;
some_tempalte<string, int>bar; //use partial specialization
部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
实例化类模板部分特化的成员
c++primer记录(二) 模板的更多相关文章
- Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客
==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- Material Calendar View 学习记录(二)
Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- 前端常用功能记录(二)—datatables表格(转)
前端常用功能记录(二)—datatables表格 并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是 ...
- JavaScript学习记录二
title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 2.VUE前端框架学习记录二
VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...
- 面试问题记录 二 (数据库、Linux、Redis)
面试问题记录 二 (数据库.Linux.Redis) 前言 接着上次的面试问题记录,在最后还有几道问的数据结构方面的知识点要补充 还是那句话:如果文中解释有明显错误,劳烦请及时指正我,在这不胜感激!! ...
- Spring Boot学习记录(二)–thymeleaf模板
自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好 ...
随机推荐
- CentOS防火墙开启、关闭与开放指定端口
系统为centos 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.由于以前部署在Win Server的VPS上,Linux ...
- 【Android】10.1 扩展组件库和其他视图--本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-02-18 1.主界面运行截图 2.MainActivity.cs文件中对应的代码 chItems.Add(new Chapter() ...
- 基于epoll的简单的httpserver
该httpserver已经能够处理并发连接,支持多个client并发訪问,每一个连接能够持续读写数据.当然.这仅仅是一个简单的学习样例.还有非常多bug,发表出来仅仅是希望大家能够互相学习.我也在不断 ...
- php preg正则表达式
Note: 反斜线在单引号字符串和双引号字符串 中都有特殊含义,因此要匹配一个反斜线, 模式中必须写为 ”\\\\”. 译注: “/\\/”, 首先它作为字符串,反斜线会进行转义, 那么转义后的结果是 ...
- 关于Snmp的Trap代码开发之坑
最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到 ...
- 推荐2个干净的PE
1,微PE(之前著名的通用PE.绝对PE都出自该作者) 官网:http://www.wepe.com.cn/ 2,金狐维护盘 官网:http://www.jinhu.me/
- 线程池 ManualResetEvent
线程池: “线程池”是可以用来在后台执行多个任务的线程集合.(有关背景信息,请参见使用线程处理.)这使主线程可以自由地异步执行其他任务. 线程池通常用于服务器应用程序.每个传入请求都将分配给线程池中的 ...
- hive 进阶笔记
-- mysql方式 create table account_channel(account_ String,channel_ String) as select a.account,b.chann ...
- 阿里云ECS,WampServer无法访问外网
情况: 使用阿里云ECS服务器.服务端打开WampServer后,在服务端能通过127.0.0.1和localhost访问到WampServer的首页. 阿里云已经给了外网IP,不需要路由器再做端口映 ...
- 推荐一款编辑SQL的工具:jsqlparser
这个工具真的挺好用的,采用的是观察者模式,Visitor. 虽然我学过这个模式,但是乍一用还是有点懵逼的. 给好一个SQL语句之后,jsqlparser可以把这个sql语句给分解成all kind o ...