因为看得源码里有大量的类模板,所以补充下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. 说实话当一个程序猿不easy

    我以前说过,程序猿不是一般的人,是具有某种超能里的人.但问题是.程序猿往往意识不到自己的这样的特异功能.在他们的眼里.会觉得自己非常普通.跟常人一样,所以,程序猿能做到的事情,其它人--比方他们的客户 ...

  2. mysql删除账户

    mysql> select user,host,password from user; +------+-----------+--------------------------------- ...

  3. %02x和%2x区别

    %02x  (x代表以十六进制形式输出,02代表不足两位,前面补0输出,如果超过两位,则以实际输出) 例: #include <stdio.h> #include <stdint.h ...

  4. assert用法总结

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int ...

  5. tornado cookie安全性

    1.cookie伪造客户端javascript或浏览器插件可以修改cookie网络传输中也可以截获请求,修改cookie 2.tornado cookie安全验证机制tornado的set_secur ...

  6. Java日志 (zhuan)

    http://www.cnblogs.com/bird-li/p/4696662.html ************************************************* 日志对于 ...

  7. macOS Sierra 10.12.4 (16E195) - Clover [ 20170403 ]

    原文:https://user.qzone.qq.com/753313822/blog/1424460141?_t_=0.48652242555134495 建议使用 1920 * 1080 屏幕分辨 ...

  8. Maven学习之(三)Maven插件创建web项目

    这里来记录一下用eclipse 创建maven 的web项目. 添加jar依赖. <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  9. 【WPF/WAF】设置快捷键(Shortcut Key)

    基于WAF框架:WPF Application Framework (WAF) View层XAML中设置热键. <Window.InputBindings> <!--<KeyB ...

  10. 【C#/WPF】UI控件的拖拽/拉伸

    需求①:控件拖拽——按住鼠标,可自由拖拽控件. 方法:目前看到的办法有两种. 使用ZoomableCanvas:http://www.cnblogs.com/gnielee/archive/2011/ ...