SlideShare une entreprise Scribd logo
1  sur  29
C++ トレーニング C++模板与泛型编程 之初级篇 Poseidon项目组
基本Thread ,[object Object]
为什么引入泛型
C++函数模板定义1 3 4 2 6 5 ,[object Object]
还为涉及的模板领域
C++类模板定义2
为什么要引入泛型 泛型是什么? 泛型编程又是什么呢? 3
为什么要引入泛型 泛型 就是C++模板的一种表现,也即类型参数化。 泛型编程(Generic Programming)  是建立在C++的Template机制基础上的一种完全不同于面向对象的程序设计思维模式。 典型作品:STL 4
为什么要引入泛型 为什么需要泛型编程? 5
为什么要引入泛型 C++ template的最初发展动机很直接:让我们得以建立类型安全(type-safe)的通用容器。 如:vecotr,list,map等。 当愈多人用上template时,他们发现template有能力完成愈多可能的变化。容器当然很好。 但是泛型编程(Generic Programming)--写出的代码和其所处理的对象类型彼此独立。 于是STL的各种算法就应运而生。 如:for_each, find, merge等。 6
为什么要引入泛型 简单的一个开发场景说明 主角:小逗童鞋 1 简单的一个开发任务 任务内容:编写compare函数,分别比较int、string、double三种类型值的大小。要求比较的两个值通过参数传入compare函数中,如果第一个值大于第二个值,就然会1,如果小于就返回-1,否则返回0。 2 日本项目中抽取的一个实例 模板函数实例 3
简单的一个案例分析 小逗提交了如下代码: int compare(const int& v1, cosnt int& v2) {     if (v1 > v2) return 1;     else if (v2 > v1) return -1;     return 0; } int compare(const string& v1, const string& v2) {     if (v1 > v2) return 1;     else if (v2 > v1) return -1;     return 0; } int compare(const double& v1, const double& v2) {     if (v1 > v2) return 1;     else if (v2 > v1) return -1;     return 0; } 8
简单的一个案例分析 小逗的主管帮小逗一起评审了这个几个函数的问题: ,[object Object]
 那有什么办法解决这个问题吗?9
简单的一个案例分析 Google之后的结论是,可以通过如下两种解决办法来处理: ,[object Object],Java以及C#中的超类,所有的类都继承与它。 通过存储基类的引用,从而通过超类的引用访问。 ,[object Object],这也正是泛型的简单定义。通过C++的模板template方式来实现。 小逗在学习了模板之后,用模板的方法解决了主管提出的问题,重构了之前的代码: template<typename T> int compare(const T& v1, const T& v2) {     if (v1 > v2) return 1;     else if (v2 > v1) return -1;     return 0;   } 小逗通过自己的努力,逐渐掌握了如何来编写一个模板函数方法。 10
简单的一个案例分析 日本项目的一个实例应用: 简单需求:处理市场发送过来的广播消息,消息数量大于有7,8种。 每种广播消息的格式的定义如下: typedef struct broadcast_message_type {    broadcast_type_t broadcast_type;    uint16_t items_n;    char filler_2_s [2];    broadcast_message_type_item_t item [9]; 每个item对应一只股票。 } broadcast_message_type _t; 现在需求是,需要把每个广播消息中对应items下面的每一只股票发送给其他线程处理。 11
简单的一个案例分析 发送消息的模板函数: template <typename msgT, typename memberT> void BOMXFFHBroadcastController::sendMessage(     char* broadcast,      ENDataEventType event_type) {     msgT* message_serise = (msgT*)broadcast;     char* data_ptr = broadcast;     uint16_t items = message_serise->items_n;     series_t series_key;     data_ptr += offsetof(msgT, item);     for (uint16_t index = 0; index < items; index++) {         series_key = message_serise->item[index].series;               sendDirectMessage(data_ptr, sizeof(memberT), event_type, series_key);         data_ptr += sizeof(memberT);     } } 12
如何引入泛型 1、C++引入单根继承 2、参数化类型 实现通用容器的方案就是使用“参数化类型”。 一个容器需要能够存放任何类型的对象,那干脆就把这个对象的类型“抽”出来,参数化它:   template<class T> class vector {     T* v;     int sz;     public:         vector(int);         T& operator[](int);         T& elem(int i) { return v[i]; }         // ... }; 13
如何引入泛型 宏不能解决这个问题吗? 那么与模板相比,宏有什么缺点呢? 14
如何引入泛型 跟模板相比,宏的最大的缺点就是它并不工作在C++的语法解析层面,宏是由预处理器来处理的,而在预处理器的眼里没有C++,只有一堆文本,只做简单的替换。因此C++的类型检查根本不起作用。 比如上面的定义如果用宏来实现,那么就算你传进去的T不是一个类型,预处理器也不会报错;只有等到文本替换完了,到C++编译器工作的时候才会发现一堆莫名其妙的类型错误,但那个时候错误就已经到处都是了。往往最后会抛出一堆吓人的编译错误。 更何况宏基本无法调试。   15
为什么要引入泛型 我们再来看一看通用算法,这是泛型的另一个动机。比如我们熟悉的C的qsort:   void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));   16
为什么要引入泛型 这个算法有如下几个问题:   1.  类型安全性:使用者必须自行保证base指向的数组的元素类型和compar的两个参数的类型是一致的;使用者必须自行保证size必须是数组元素类型的大小。 2.  通用性:qsort对参数数组的二进制接口有严格要求——它必须是一个内存连续的数组。如果你实现了一个巧妙的、分段连续的自定义数组,就没法使用qsort了。 3.  接口直观性:如果你有一个数组char* arr = new arr[10];那么该数组的元素类型其实就已经“透露”了它自己的大小。然而qsort把数组的元素类型给“void”掉了(void *base),于是丢失掉了这一信息,而只能让调用方手动提供一个size。为什么要把数组类型声明为void*?因为除此之外别无它法,声明为任意一个类型的指针都不妥(compar的参数类型也是如此)。qsort为了通用性,把类型信息丢掉了,进而导致了必须用额外的参数来提供类型大小信息。在这个特定的算法里问题还不明显,毕竟只多一个size参数而已,但一旦涉及的类型信息多了起来,其接口的可伸缩性(scalability)问题和直观性问题就会逐渐显现。 4.  效率:compar是通过函数指针调用的,这带来了一定的开销。但跟上面的其它问题比起来这个问题还不是最严重的。 17
函数和类模板 那该如何编写一个C++模板呢? ,[object Object]
 类模板 18
函数模板(Function template)大解剖 定义C++ 模板的关键字 模板定义都以它开头。 template <typename T, size_t N> T sumArray(T (&arr)[N]) {     T sum=0; for (int i = 0; i < N; ++i) {         sum += arr[i];     }     return sum; } 模板形参表 表示类型的类型形参(T) 表示常量表达式的非类型形参(N)。 模板函数体 在模板函数内部,可以使用类型形参 T 引用一个类型,T 表示哪种实际类型由编译器根据所用的函数而确定。 sumArray<int, 10>(array)  <<--称之为模板的实例化(显示的模板实参),在编译阶段完成。 inline函数模板: template <typename T> inline T min(const T&, const T&);  ○ inline template <typename T> T min(const T&, const T&); × 注意inline关键字的位置 19
函数模板(Function template)大解剖 C++ Function Template Overloading template <class T> inline const T& min(const T& a, const T& b) {       return b < a ? b : a; } 例如: r3 = min(r1, r2); 编译器做参数推导。 ■任何类型对象都可以 运用min(), 需要支持 operator<。 template <class T, class C> inline const T& min(const T& a, const T& b, C comp) {         return comp(b, a) ? b : a; } 例如: r3 = min(r1, r2, compare); 编译器做参数推导。 ■需要根据类型自定义 比较函数,传入函数指针。 20
类模板(class template)大解剖 定义C++ 类模板的关键字 类模板定义都以它开头。 template < typename T, size_t N = 32> class BFixedArray { public:      explicit BFixedArray(size_t dim = N)         : _cItems(dim), _buffer(_internal)      {         if(dim > THRESHOLD) {             _buffer = new T[dim];         }      }     ~BFixedArray() {         if (!isOnStack()) {             delete[] _buffer;         }     }     size_t size() const {         return _cItems;     } 模板形参表 表示类型的类型形参(T) 表示常量表达式的非类型形参(N)。 类模板定义体 在类模板内部,可以使用类型形参 T 引用一个类型,T 表示哪种实际类型由编译器根据所用的函数而确定。 编译器将使用用户提供的实际类型来实例化这个类模板。 BFixedArray<char, 128> sendbuffer(length); BFixedArray<int, 128> fixedBuffer(length); 类型形参由关键字class或typename后街说明符构成。在模板形参表中,这两个关键字具有相同的含义,都指出后面所接的名字表示一个类型。 当然在模板的使用上,也是有不同之处(在模板定义内部指定类型)  21
类模板(Class template)大解剖 C++ Class Member Template 22
编写泛型程序的简单原则 如何做两个 数字的比较呢 一般的程序思维里 if (v1 > v2) 或者 else if (v1 < v2) 但是在泛型思维中  if (v1 > v2)  或者 else if (v2 > v1) 类型只需要支持 > 而不必支持 < 简单原则:编写独立于类型的代码,对实参类型的要求尽可能少时有很有益的。 23

Contenu connexe

Tendances

C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能shademoon
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集shademoon
 
Intro to C++ Basic
Intro to C++ BasicIntro to C++ Basic
Intro to C++ BasicShih Chi Lin
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態shademoon
 
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)Kai-Feng Chou
 
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2terry28853669
 
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHPPHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHPLi-Wei Lu
 
Javascript oop-o52tiger
Javascript oop-o52tigerJavascript oop-o52tiger
Javascript oop-o52tigero52tiger
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗乐群 陈
 

Tendances (19)

Ch10
Ch10Ch10
Ch10
 
Ch03
Ch03Ch03
Ch03
 
08 指標
08 指標08 指標
08 指標
 
第6章指针
第6章指针第6章指针
第6章指针
 
Ch10
Ch10Ch10
Ch10
 
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
Intro to C++ Basic
Intro to C++ BasicIntro to C++ Basic
Intro to C++ Basic
 
C語言結構與串列
C語言結構與串列 C語言結構與串列
C語言結構與串列
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
 
Ch07
Ch07Ch07
Ch07
 
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)
 
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2
 
C語言標準輸出入函式
C語言標準輸出入函式C語言標準輸出入函式
C語言標準輸出入函式
 
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHPPHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
 
Javascript oop-o52tiger
Javascript oop-o52tigerJavascript oop-o52tiger
Javascript oop-o52tiger
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
 
Python 迴圈作業
Python 迴圈作業Python 迴圈作業
Python 迴圈作業
 
C語言列舉與聯合
C語言列舉與聯合C語言列舉與聯合
C語言列舉與聯合
 

En vedette

En vedette (14)

(H)05 vvh6 f-vde_121637
(H)05 vvh6 f-vde_121637(H)05 vvh6 f-vde_121637
(H)05 vvh6 f-vde_121637
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
Ning site documentary films
Ning site documentary filmsNing site documentary films
Ning site documentary films
 
Assignment 7
Assignment 7Assignment 7
Assignment 7
 
Slideshow
SlideshowSlideshow
Slideshow
 
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8
 
Getting Started Task #3
Getting Started Task #3Getting Started Task #3
Getting Started Task #3
 
Te kiero mucho !
Te kiero mucho !Te kiero mucho !
Te kiero mucho !
 
Vorlesung 2009 wind_3
Vorlesung 2009 wind_3Vorlesung 2009 wind_3
Vorlesung 2009 wind_3
 
TLPI - Chapter 44 Pipe and Fifos
TLPI - Chapter 44 Pipe and FifosTLPI - Chapter 44 Pipe and Fifos
TLPI - Chapter 44 Pipe and Fifos
 
Vde certificate
Vde certificateVde certificate
Vde certificate
 
Tax Reform
Tax ReformTax Reform
Tax Reform
 
大家來學GObject
大家來學GObject大家來學GObject
大家來學GObject
 

Similaire à C++模板与泛型编程

ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemadKitor23
 
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点thinkinlamp
 
Metro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' ViewMetro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' ViewEric ShangKuan
 
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础wklken
 
VC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSUVC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSUGavin Gao
 
第8章结构体与共用体
第8章结构体与共用体第8章结构体与共用体
第8章结构体与共用体summerfeng
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记Lingfei Kong
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档yiditushe
 
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索Chui-Wen Chiu
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式Will Huang
 

Similaire à C++模板与泛型编程 (20)

第5章数组
第5章数组第5章数组
第5章数组
 
Ch10 教學
Ch10 教學Ch10 教學
Ch10 教學
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemad
 
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
 
图形学讲义
图形学讲义图形学讲义
图形学讲义
 
Metro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' ViewMetro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' View
 
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础
 
VC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSUVC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSU
 
第8章结构体与共用体
第8章结构体与共用体第8章结构体与共用体
第8章结构体与共用体
 
Ch6 函式
Ch6 函式Ch6 函式
Ch6 函式
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
 
[系列活動] Python 爬蟲實戰
[系列活動] Python 爬蟲實戰[系列活動] Python 爬蟲實戰
[系列活動] Python 爬蟲實戰
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
 
SCJP ch08
SCJP ch08SCJP ch08
SCJP ch08
 
Python 2-基本語法
Python 2-基本語法Python 2-基本語法
Python 2-基本語法
 

C++模板与泛型编程