因为看得源码里有大量的类模板,所以补充下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记录(二) 模板的更多相关文章

  1. Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客

    ==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...

  2. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  3. Material Calendar View 学习记录(二)

    Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...

  4. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  5. 前端常用功能记录(二)—datatables表格(转)

    前端常用功能记录(二)—datatables表格 并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是 ...

  6. JavaScript学习记录二

    title: JavaScript学习记录二 toc: true date: 2018-09-13 10:14:53 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  7. 2.VUE前端框架学习记录二

    VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...

  8. 面试问题记录 二 (数据库、Linux、Redis)

    面试问题记录 二 (数据库.Linux.Redis) 前言 接着上次的面试问题记录,在最后还有几道问的数据结构方面的知识点要补充 还是那句话:如果文中解释有明显错误,劳烦请及时指正我,在这不胜感激!! ...

  9. Spring Boot学习记录(二)–thymeleaf模板

    自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好 ...

随机推荐

  1. Ubuntu 安装谷歌拼音输入法

    Ubuntu14.04内置的拼音输入法有一个bug,使得Live USB全拼无法使用. 安装Google拼音输入法步骤如下: 1. 打开Ubuntu软件中心 (Ubuntu Software Cent ...

  2. Maven工程pom.xml文件秒变gradle工程的命令

    下面是一个maven工程,我想把它转成gradle项目,怎么办? 打开cmd命令行窗口,切换到你的maven工程的pom.xml文件所在目录,然后执行如下命令: gradle init --type ...

  3. 使用konva来绘制一个矩形

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. [转]Windows Server 2008 对 CPU 及 RAM 的支持规格

    Windows Server 2008 对 CPU 的支援: 在看到下表时,请注意其数字所指的是:主板上的实体 CPU的个数,也就是几个 Sockets 举例来说,机器上安装 2 个 4 核心的 CP ...

  5. iOS开发之Xcode常见错误

    一."file/file.h" file not found 如果遇到这种类型的问题报错,可以分为三部来解决,由简到复杂一步一步来,直到解决问题位置.1. 点击Xcode -> ...

  6. Spring 网路搜集的情报

    Spring Validate http://haohaoxuexi.iteye.com/blog/1812584

  7. CAS (2) —— Mac下配置CAS到Tomcat(客户端)

    CAS (2) -- Mac下配置CAS到Tomcat(客户端) tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: cas4.1.2 cas-clie ...

  8. linux 使用NSF 映射远程磁盘目录

    假设源目录在192.168.1.1机器上,目录为/data 客户端集群在192.168.1.2, 需要将192.168.1.1机器上的/data目录到本地的/data目录 1.在两台机器上安装nsf ...

  9. FastDFS 安装步骤

    nginx01        121nginx02        122 tracker01      131tracker02      132 storage01      141storage0 ...

  10. Hibernate- 条件查询

    01.搭建开发环境 02.条件查询 package com.gordon.test; import java.util.List; import org.hibernate.Query; import ...