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++函数模板与类模板的理解.具体内容如下: 泛型编程( ...
随机推荐
- 【Java基础】并发
Num1:同步访问共享的可变数据 关键字Synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块.. 同步不仅仅理解为互斥的方式,如果没有同步,一个线程的变化就不能 ...
- 【Python实战】Pandas:让你像写SQL一样做数据分析(二)
1. 引言 前一篇介绍了Pandas实现简单的SQL操作,本篇中将主要介绍一些相对复杂一点的操作.为了方便后面实操,先给出一份简化版的设备统计数据: 0 android NLL 387546520 2 ...
- 数字限时增长效果实现:numberGrow.js
这是上周工作中写到的一个功能,大概的效果就是页面中有几处数字,统计公司的一些业务信息,需要在第一次出现的时候,做一个从0开始增长,大概2秒自动增长到真实数值,并停止增长的效果.这个问题的重点在于解决如 ...
- WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】
WCF Interview Questions – Part 4 This WCF service tutorial is part-4 in series of WCF Interview Qu ...
- 关于SQL储存过程中输出多行数据
declare @num1 int --为符合条件的总行数 select @num1=COUNT(1) from cardInfo where openDate between @ ...
- 异构SOA系统架构之Asp.net实现(兼容dubbo)
我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多. 使用的编程语言也有点复杂,主流语言有.net(C#).Java. ...
- 用python来个百度关键词刷排名脚本
目的:写个脚本来提升百度排名 我一个seo届前辈的朋友找我,他说,seo事无巨细,自己主观方面能做的几乎都能做了,提升百度等搜索引擎中的排名往往效果不佳或者起效周期慢.能不能人为去干预下呢? 获得排名 ...
- hibernate缓存(一级缓存、二级缓存)
一.一级缓存(Session缓存) 意义:提高hibernate查询效率. 缺点:可能会因并发,产生数据不一致. 基于session的缓存,利用hibernate执行查询 ...
- 企业商务差旅信息化管理与移动App
背景 某航空公司需要到北京某服务提供商公司学习交流,为了节省出行成本让出差员工乘坐公司运营航线,去程路途较远.需要在先乘飞机到天津机场,转地铁后,再乘动车到北京.回程时发生 后补机票失败, ...
- JVM监控工具介绍
JVM监控工具介绍 VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jst ...