C++STL - 类模板
注意: 类模板不能隐式推断,必须显示致命类型实参.
#include <iostream> using namespace std; template<typename T> class Comparator { public: Comparator (T x, T y) :m_x (x), m_y (y) {} T min (void) const {return m_x < m_y ? m_x : m_y;} T max (void) const {return m_x < m_y ? m_y : m_x;} void foo (void) const {cout << "foo" << endl;} private: T m_x, m_y; }; class Integer { public: Integer () : m_var (arg) {} bool operator< (Integer const& rhs) const{ return m_var < rhs.m_var; } friend ostream& operator<< (ostream& os,Integer const& i) { return os << i.m_var; } private: int m_var; }; int main (void) { , b = ; Comparator<int> ci (a, b); cout << ci.min () << ' ' << ci.max () << endl; double c = 1.3, d = 4.6; Comparator<double> cd (c, d); cout << cd.min () << ' ' << cd.max () << endl; string e = "hello", f = "world"; Comparator<string> cs (e, f); cout << cs.min () << ' ' << cs.max () << endl; Comparator<Integer> cn (a, b); cout << cn.min () << ' ' << cn.max ()<< endl; ; }
#include <iostream> using namespace std; template<typename T> class A { public: void paddr (void) const { cout << "非静:" << &m_var << ",静态:" << &s_var << endl; } private: int m_var; static int s_var; }; template<typename T> int A<T>::s_var; int main (void) { A<int> a, b; A<double> c, d; a.paddr (); b.paddr (); c.paddr (); d.paddr (); ; }
#include <iostream> #include <cstring> using namespace std; // 通用版本 template<typename T> T max (T x, T y) { return x < y ? y : x; } // 针对字符指针类型的重载版本 char* max (char* x, char* y) { ? y : x; } // 通用版本 template<typename T> class Comparator { public: Comparator (T x, T y) : m_x (x), m_y (y) {} T max (void) const { return m_x < m_y ? m_y : m_x; } /* char* max (void) const { return strcmp (m_x, m_y) < 0 ? m_y : m_x; } */ private: T m_x, m_y; }; // 针对字符指针类型的特化版本 /* template<> class Comparator<char*> { public: Comparator (char* x, char* y) : m_x (x), m_y (y) {} char* max (void) const { return strcmp (m_x, m_y) < 0 ? m_y : m_x; } private: char* m_x, *m_y; }; */ template<> char* Comparator<char*>::max (void) const { ? m_y : m_x; } int main (void) { , b = ; cout << ::max (a, b) << endl; char c[] = "hello", d[] = "world"; cout << ::max (c, d) << endl; /* cout << ::max<string> (c, d) << endl; cout << ::max (string (c), string (d)) << endl; */ Comparator<int> ci (a, b); cout << ci.max () << endl; Comparator<char*> cs (c, d); cout << cs.max () << endl; ; }
#include <iostream> using namespace std; // 通用版本 template<typename A, typename B> class X { public: X (void) {cout << "X<A,B>" << endl;} private: A m_a; B m_b; }; // 完全特化 template<> class X<int, short> { public: X (void) {cout << "X<int,short>" << endl;} private: int m_a; short m_b; }; // 局部特化 template<typename A> class X<A, short> { public: X (void) {cout << "X<A,short>" << endl;} private: A m_a; short m_b; }; template<typename A> class X<A, A> { public: X (void) {cout << "X<A,A>" << endl;} private: A m_a; A m_b; }; template<typename A> class X<A, A*> { public: X (void) {cout << "X<A,A*>" << endl;} private: A m_a; A* m_b; }; template<typename A, typename B> class X<A*, B*> { public: X (void) {cout << "X<A*,B*>" << endl;} private: A* m_a; B* m_b; }; template<typename A> class X<A*, A*> { public: X (void) {cout << "X<A*,A*>" << endl;} private: A* m_a; A* m_b; }; int main (void) { // 选择顺序:完全特化>局部特化>通用版本 X<int, short> x1; X<double, short> x2; X<char, short> x3; X<int, double> x4; X<int, int> x5; X<double, double> x6; X<int, int*> x7; X<double, double*> x8; X<int*, double*> x9; X<short**, char*****> x10; X<int*, int*> x11; ; }
#include <errno.h> #include <cstdio> #include <cstring> #include <iostream> #include <memory> using namespace std; class A { public: A (void) {cout << "A构造:" << this << "->" << sizeof (*this) << endl;} ~A (void) {cout << "A析构:" << this << "->" << sizeof (*this) << endl;} void print (size_t i) const {cout << m_data[i] << endl;} ]; }; template<typename T> class AutoPtr { public: AutoPtr (T* p = NULL) : m_p (p) {} AutoPtr (AutoPtr& that) : m_p (that.release ()) {} AutoPtr& operator= (AutoPtr& rhs) { if (&rhs != this) reset (rhs.release ()); return *this; } ~AutoPtr (void) { delete m_p; } T& operator* (void) const { return *m_p; } T* operator-> (void) const { return &**this; } private: T* release (void) { T* p = m_p; m_p = NULL; return p; } void reset (T* p) { if (p != m_p) { delete m_p; m_p = p; } } T* m_p; }; template<typename T> class AutoPtr<T[]> { public: AutoPtr (T* p = NULL) : m_p (p) {} AutoPtr (AutoPtr& that) : m_p (that.release ()) {} AutoPtr& operator= (AutoPtr& rhs) { if (&rhs != this) reset (rhs.release ()); return *this; } ~AutoPtr (void) { delete[] m_p; } T& operator* (void) const { return *m_p; } T* operator-> (void) const { return &**this; } private: T* release (void) { T* p = m_p; m_p = NULL; return p; } void reset (T* p) { if (p != m_p) { delete[] m_p; m_p = p; } } T* m_p; }; void foo (void) { /* A a, *pa = &a; pa->m_data[0] = 12345; (*pa).print (0); */ // A* pa = new A; AutoPtr<A> pa (new A); pa->m_data[] = ; // pa.operator->()->m_data[0] = 12345; (*pa).print (); // pa.operator*().print (0); AutoPtr<A> pb = pa; // 拷贝构造 ++pb->m_data[]; (*pb).print (); AutoPtr<A> pc (new A); pc->m_data[] = ; pb = pc; // 拷贝赋值 ++pb->m_data[]; (*pb).print (); FILE* fp = fopen ("none", "r"); if (! fp) { // delete pa; throw errno; } // ... fclose (fp); // delete pa; } int main (void) { /* try { foo (); } catch (int ex) { cout << strerror (ex) << endl; return -1; } cout << "成功!" << endl; */ // AutoPtr<A[]> pa (new A[3]); AutoPtr<A> pa (new A); /* auto_ptr<T> */ ; }
C++STL - 类模板的更多相关文章
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- STL标准模板类
STL,中文名标准模板库,是一套C++的标准模板类(是类!),包含一些模板类和函数,提供常用的算法和数据结构. STL分为:迭代器,容器,适配器,算法以及函数对象. --迭代器是一种检查容器内元素并遍 ...
- 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类
本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...
- 智能指针类模板(上)——STL中的智能指针
智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...
- STL之template类模板
#include <iostream> using namespace std; template<class T>//类模板 class Person{ public://构 ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- 4.1 pair类模板
在学习关联容器之前,首先先要了解一下STL中的pair类模板,因为关联容器的一些成员函数返回值都是pair对象,而且map 和multimap中的元素都是pair对象. 1)pair类模板定义 pai ...
- [Reprint] C++函数模板与类模板实例解析
这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...
随机推荐
- Circuit Breaker Pattern(断路器模式)
Handle faults that may take a variable amount of time to rectify when connecting to a remote service ...
- 一步一步开发Game服务器(二)登陆2
上一篇文章,讲解了简单的登陆情况.接下来我们继续讲解登陆模块. 在正常的游戏服务器情况下.在尚未登录前可以查看服务器大区情况,登陆后也可以查看服务器大区情况,然后选择大区服务器.进行登录操作. 这样的 ...
- C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...
- [Excel] 打印设置
Excel 中每一个 WorkSheet 都有一个 PageSetup 对象,用于设置打印属性: 一:页面 1. Orientation,返回或设置一个 XlPageOrientation 值,表示纵 ...
- T-SQL 循环表的一种方式
原文来自:https://www.lesg.cn/netdaima/sqlservert-sql/2016-463.html SsqlServer 中循环表有几种方式 1.临时表 2.游标 3-. 下 ...
- Mule入门基础
Mule入门文档 零.前提 在按照本文进行操作之前,假设您的系统已经具备以下前提: 已经安装了Sun公司的JDK1.4或JDK5.0版本,推荐使用JDK5.0. 正确设置了JAVA_HOME环境变量到 ...
- 在多行列表中id同名的<a>标签点击事件处理方法
Struts2标签 问题描述:最近项目中在使用struts迭代标签动态生成列表的过程中,由于每一行li元素中包含<a>超链接,如下图 一开始超链接是这样的<a href=“#” id ...
- VS2015开发Android,自带模拟器无法调试、加载程序,算是坑吗
VS2015出来后,确定变化很大,什么android.ios的,不在话下.对于我这样传统型的人,也第一时间试用了一下(vs2003->vs2008->vs2012->vs2015). ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- 推荐15款响应式的 jQuery Lightbox 插件
利用现代 Web 技术,网络变得越来越轻巧与.模态框是突出展现内容的重要形式,能够让用户聚焦到重要的内容上去.在这个列表中,我们编制了15款响应式的 jQuery 灯箱库,这将有助于开发人员创建和设计 ...