Soumettre la recherche
Mettre en ligne
C++模板与泛型编程
•
Télécharger en tant que PPTX, PDF
•
2 j'aime
•
1,704 vues
D
deer hope
Suivre
C++ template.
Lire moins
Lire la suite
Signaler
Partager
Signaler
Partager
1 sur 29
Télécharger maintenant
Recommandé
xwz 2010-10-31
xwz 2010-10-31
carlxwz
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
1 C入門教學
1 C入門教學
Sita Liu
第4章函数
第4章函数
summerfeng
Introduction to C++ over CLI
Introduction to C++ over CLI
建興 王
Dev307
Dev307
建興 王
07 陣列與字串
07 陣列與字串
shademoon
Ch 8
Ch 8
BMG2011
Recommandé
xwz 2010-10-31
xwz 2010-10-31
carlxwz
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
1 C入門教學
1 C入門教學
Sita Liu
第4章函数
第4章函数
summerfeng
Introduction to C++ over CLI
Introduction to C++ over CLI
建興 王
Dev307
Dev307
建興 王
07 陣列與字串
07 陣列與字串
shademoon
Ch 8
Ch 8
BMG2011
Ch10
Ch10
jashliao
Ch03
Ch03
jashliao
08 指標
08 指標
shademoon
第6章指针
第6章指针
summerfeng
Ch10
Ch10
Alisha Smile
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
shademoon
第六章 函數與巨集
第六章 函數與巨集
shademoon
Intro to C++ Basic
Intro to C++ Basic
Shih Chi Lin
C語言結構與串列
C語言結構與串列
吳錫修 (ShyiShiou Wu)
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
shademoon
Ch07
Ch07
jashliao
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)
Kai-Feng Chou
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2
terry28853669
C語言標準輸出入函式
C語言標準輸出入函式
吳錫修 (ShyiShiou Wu)
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
Li-Wei Lu
Javascript oop-o52tiger
Javascript oop-o52tiger
o52tiger
竞赛中C++语言拾遗
竞赛中C++语言拾遗
乐群 陈
Python 迴圈作業
Python 迴圈作業
吳錫修 (ShyiShiou Wu)
C語言列舉與聯合
C語言列舉與聯合
吳錫修 (ShyiShiou Wu)
(H)05 vvh6 f-vde_121637
(H)05 vvh6 f-vde_121637
Shen Tai Electric Cable Co., Ltd.
C++模板与泛型编程
C++模板与泛型编程
deer hope
C++模板与泛型编程
C++模板与泛型编程
deer hope
Contenu connexe
Tendances
Ch10
Ch10
jashliao
Ch03
Ch03
jashliao
08 指標
08 指標
shademoon
第6章指针
第6章指针
summerfeng
Ch10
Ch10
Alisha Smile
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
shademoon
第六章 函數與巨集
第六章 函數與巨集
shademoon
Intro to C++ Basic
Intro to C++ Basic
Shih Chi Lin
C語言結構與串列
C語言結構與串列
吳錫修 (ShyiShiou Wu)
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
shademoon
Ch07
Ch07
jashliao
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)
Kai-Feng Chou
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2
terry28853669
C語言標準輸出入函式
C語言標準輸出入函式
吳錫修 (ShyiShiou Wu)
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
Li-Wei Lu
Javascript oop-o52tiger
Javascript oop-o52tiger
o52tiger
竞赛中C++语言拾遗
竞赛中C++语言拾遗
乐群 陈
Python 迴圈作業
Python 迴圈作業
吳錫修 (ShyiShiou Wu)
C語言列舉與聯合
C語言列舉與聯合
吳錫修 (ShyiShiou Wu)
Tendances
(19)
Ch10
Ch10
Ch03
Ch03
08 指標
08 指標
第6章指针
第6章指针
Ch10
Ch10
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
第六章 函數與巨集
第六章 函數與巨集
Intro to C++ Basic
Intro to C++ Basic
C語言結構與串列
C語言結構與串列
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
Ch07
Ch07
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2
C語言標準輸出入函式
C語言標準輸出入函式
PHP 初階課程 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-o52tiger
竞赛中C++语言拾遗
竞赛中C++语言拾遗
Python 迴圈作業
Python 迴圈作業
C語言列舉與聯合
C語言列舉與聯合
En vedette
(H)05 vvh6 f-vde_121637
(H)05 vvh6 f-vde_121637
Shen Tai Electric Cable Co., Ltd.
C++模板与泛型编程
C++模板与泛型编程
deer hope
C++模板与泛型编程
C++模板与泛型编程
deer hope
Ning site documentary films
Ning site documentary films
jessicam0101
Assignment 7
Assignment 7
jessicam0101
Slideshow
Slideshow
moazamrauf
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8
Shu-Yu Fu
Getting Started Task #3
Getting Started Task #3
moazamrauf
Te kiero mucho !
Te kiero mucho !
hassbleidy angulo moscote
Vorlesung 2009 wind_3
Vorlesung 2009 wind_3
arjun
TLPI - Chapter 44 Pipe and Fifos
TLPI - Chapter 44 Pipe and Fifos
Shu-Yu Fu
Vde certificate
Vde certificate
Shen Tai Electric Cable Co., Ltd.
Tax Reform
Tax Reform
106designs
大家來學GObject
大家來學GObject
Shu-Yu Fu
En vedette
(14)
(H)05 vvh6 f-vde_121637
(H)05 vvh6 f-vde_121637
C++模板与泛型编程
C++模板与泛型编程
C++模板与泛型编程
C++模板与泛型编程
Ning site documentary films
Ning site documentary films
Assignment 7
Assignment 7
Slideshow
Slideshow
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8
Getting Started Task #3
Getting Started Task #3
Te kiero mucho !
Te kiero mucho !
Vorlesung 2009 wind_3
Vorlesung 2009 wind_3
TLPI - Chapter 44 Pipe and Fifos
TLPI - Chapter 44 Pipe and Fifos
Vde certificate
Vde certificate
Tax Reform
Tax Reform
大家來學GObject
大家來學GObject
Similaire à C++模板与泛型编程
第5章数组
第5章数组
summerfeng
Ch10 教學
Ch10 教學
hungchiayang1
getPDF.aspx
getPDF.aspx
byron zhao
getPDF.aspx
getPDF.aspx
byron zhao
ajax_onlinemad
ajax_onlinemad
Kitor23
数据处理算法设计要点
数据处理算法设计要点
thinkinlamp
图形学讲义
图形学讲义
guest829549204
Metro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' View
Eric ShangKuan
Python 脚本入门基础
Python 脚本入门基础
wklken
VC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSU
Gavin Gao
第8章结构体与共用体
第8章结构体与共用体
summerfeng
Ch6 函式
Ch6 函式
requiemformemories
香港六合彩
香港六合彩
香港六合彩 六合彩
Python学习笔记
Python学习笔记
Lingfei Kong
Free Marker中文文档
Free Marker中文文档
yiditushe
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
Chui-Wen Chiu
[系列活動] Python 爬蟲實戰
[系列活動] Python 爬蟲實戰
台灣資料科學年會
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
Will Huang
SCJP ch08
SCJP ch08
r82093403
Python 2-基本語法
Python 2-基本語法
阿Samn的物理課本
Similaire à C++模板与泛型编程
(20)
第5章数组
第5章数组
Ch10 教學
Ch10 教學
getPDF.aspx
getPDF.aspx
getPDF.aspx
getPDF.aspx
ajax_onlinemad
ajax_onlinemad
数据处理算法设计要点
数据处理算法设计要点
图形学讲义
图形学讲义
Metro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' View
Python 脚本入门基础
Python 脚本入门基础
VC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSU
第8章结构体与共用体
第8章结构体与共用体
Ch6 函式
Ch6 函式
香港六合彩
香港六合彩
Python学习笔记
Python学习笔记
Free Marker中文文档
Free Marker中文文档
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
各種酷炫圖表繪製技術 Silverlight Toolkit 與 MS Chart 控制項大探索
[系列活動] Python 爬蟲實戰
[系列活動] Python 爬蟲實戰
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
SCJP ch08
SCJP ch08
Python 2-基本語法
Python 2-基本語法
C++模板与泛型编程
1.
C++ トレーニング C++模板与泛型编程
之初级篇 Poseidon项目组
2.
3.
为什么引入泛型
4.
5.
还为涉及的模板领域
6.
C++类模板定义2
7.
为什么要引入泛型 泛型是什么? 泛型编程又是什么呢?
3
8.
为什么要引入泛型 泛型 就是C++模板的一种表现,也即类型参数化。
泛型编程(Generic Programming) 是建立在C++的Template机制基础上的一种完全不同于面向对象的程序设计思维模式。 典型作品:STL 4
9.
为什么要引入泛型 为什么需要泛型编程? 5
10.
为什么要引入泛型 C++ template的最初发展动机很直接:让我们得以建立类型安全(type-safe)的通用容器。
如:vecotr,list,map等。 当愈多人用上template时,他们发现template有能力完成愈多可能的变化。容器当然很好。 但是泛型编程(Generic Programming)--写出的代码和其所处理的对象类型彼此独立。 于是STL的各种算法就应运而生。 如:for_each, find, merge等。 6
11.
为什么要引入泛型 简单的一个开发场景说明 主角:小逗童鞋
1 简单的一个开发任务 任务内容:编写compare函数,分别比较int、string、double三种类型值的大小。要求比较的两个值通过参数传入compare函数中,如果第一个值大于第二个值,就然会1,如果小于就返回-1,否则返回0。 2 日本项目中抽取的一个实例 模板函数实例 3
12.
简单的一个案例分析 小逗提交了如下代码: 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
13.
14.
那有什么办法解决这个问题吗?9
15.
16.
简单的一个案例分析 日本项目的一个实例应用: 简单需求:处理市场发送过来的广播消息,消息数量大于有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
17.
简单的一个案例分析 发送消息的模板函数: 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
18.
如何引入泛型 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
19.
如何引入泛型 宏不能解决这个问题吗? 那么与模板相比,宏有什么缺点呢?
14
20.
如何引入泛型 跟模板相比,宏的最大的缺点就是它并不工作在C++的语法解析层面,宏是由预处理器来处理的,而在预处理器的眼里没有C++,只有一堆文本,只做简单的替换。因此C++的类型检查根本不起作用。 比如上面的定义如果用宏来实现,那么就算你传进去的T不是一个类型,预处理器也不会报错;只有等到文本替换完了,到C++编译器工作的时候才会发现一堆莫名其妙的类型错误,但那个时候错误就已经到处都是了。往往最后会抛出一堆吓人的编译错误。
更何况宏基本无法调试。 15
21.
为什么要引入泛型 我们再来看一看通用算法,这是泛型的另一个动机。比如我们熟悉的C的qsort:
void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *)); 16
22.
为什么要引入泛型 这个算法有如下几个问题:
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
23.
24.
类模板 18
25.
函数模板(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
26.
函数模板(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
27.
类模板(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
28.
类模板(Class template)大解剖 C++
Class Member Template 22
29.
编写泛型程序的简单原则 如何做两个 数字的比较呢
一般的程序思维里 if (v1 > v2) 或者 else if (v1 < v2) 但是在泛型思维中 if (v1 > v2) 或者 else if (v2 > v1) 类型只需要支持 > 而不必支持 < 简单原则:编写独立于类型的代码,对实参类型的要求尽可能少时有很有益的。 23
30.
编写泛型程序的简单原则 一般编程思维中的代码: template<typename
T> int compare(const T& v1, const T& v2) { if (v1 > v2) return 1; else if (v1 < v2) return -1; return 0; } 根据泛型编程原则重构代码: template<typename T> int compare(const T& v1, const T& v2) { if (v1 > v2) return 1; else if (v2 > v1) return -1; return 0; } 24
31.
模板的编译模型 为啥STL的源代码中只有头文件呢? 25
32.
模板编译模型 标准C++为编译模板代码定义了两种编译模型。 包含编译模型(Inclusion
compilation model) 几乎所有的编译器都支持的编译模式。 简单的说,就是模板定义放在头文件中。如STL。 不过,头文件中提供模板定义存在几个缺点: 函数的实现细节暴露。 如果大量的模板定义放于头文件中,会增加文件间的编译依赖,增加编译时间。 分离编译模型(Separate compilation model) 只有一部分编译器支持。 简单说,模板的声明放于头文件中,定义放于源文件中。 此种组织形式,和我们常规的非内联函数的定义组织方式相同 26
33.
模板编译模型 export(可选) template
<class elemType> void Array<elemType>::init( const elemType *array, int sz ) { if ( ! array ) { _size = 0; _ia = 0; } if ( sz < 1 ) sz = 1; _size = sz; _ia = new elemType[ _size ]; for ( int ix = 0; ix < _size; ++ix ) _ia[ ix ] = array[ ix ]; } 日本项目开发环境: perseus ose_omx_order_book_detail_server/src> gcc -v gcc version 3.3.3 (SuSE Linux) 27
34.
关于泛型编程参考书籍:
35.
C++模板与泛型编程 谢 谢。
Télécharger maintenant