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可以很好 ...
随机推荐
- javascript淡入淡出效果的实现思路
这个思路是最近写XScroll.js类的时候想明白的.平常我们说的淡入淡出效果,一般分成两部分,一半是淡入,另一半就是淡出了.不过经过分析,我觉得其实只需要一半就行了如题,只有思路,没有代码. 这个思 ...
- JVM 发生OOM的四种情况
1.Java堆溢出:heap Java堆内存主要用来存放运行过程中所以的对象,该区域OOM异常一般会有如下错误信息;java.lang.OutofMemoryError:Javaheap space此 ...
- linux io architecture
http://www.cs.columbia.edu/~krj/os/lectures/L24-IO.pdf http://events.linuxfoundation.org/sites/event ...
- lua连续随机数
号外:惭愧,工作后几乎没有写博客了,其实是有时间的(每周单休),只是厌烦对着屏幕了,还有懒. 现在老板换人了,时间会多点,估计正常就每周双休了,决定还是每周写两篇(不一定是love2d), 写不出就翻 ...
- 我对C++的一些疑问
我对C++的一些疑问,最近使用C++,总感觉有些东西自己没有抓住,也可能是自己基础学的不是很扎实,所以对一些基本的东西理解不够透彻导致的.因为自己在学校也学过C#和java,C#它是一个完全的面向对象 ...
- Activiti进行时——企业工作流生命周期贯通 (zhuan)
http://www.jianshu.com/p/e6971e8a8dad ********************************************** 图1:一个典型的审批工作流程 ...
- 面向对象 之 [C++面试题]
说到面向对象,大家第一反应应该就是它的三大特性:封装性.继承性和多态性.那么我们先简单的了解一下这三大特性: (1)封装性:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的 ...
- 屏幕相关操作(XE10.1+WIN8.164)
相关资料: http://www.bianceng.cn/Programming/Delphi/201104/25455.htm http://blog.csdn.net/anbangs/articl ...
- Linux下chmod命令
命令格式 参数 描述 u User,即文件或目录的拥有者 g Group,即文件或目录的所属群组 o Other,除了文件或目录拥有者或所属群组之外,其它用户皆属于这个范围 a All,即全部的用户, ...
- BusyBox inittab
# /etc/inittab init(8) configuration for BusyBox## Copyright (C) 1999-2004 by Erik Andersen <ande ...