C++STL - 模板的其他特性
- #include <iostream>
- #include <typeinfo>
- using namespace std;
- template<typename A = int,typename B = double, typename C = string>
- //template<typename A,typename B = double, typename C = string> //ok
- //template<typename A = int,typename B, typename C = string> //error
- //template<typename A = int,typename B = double, typename C> //error
- class X {
- public:
- static void foo (void) {
- cout << typeid (A).name () << ' ' << typeid (B).name () << ' ' << typeid (C).name () << endl;
- }
- };
- int _x = 200;
- void foo (int x, int y = /*x*/_x) {
- cout << x << ' ' << y << endl;
- }
- template<typename A, typename B = A>
- //template<typename A = B, typename B = int> //error
- class Y {
- public:
- static void foo (void) {
- cout << typeid (A).name () << ' ' << typeid (B).name () << endl;
- }
- };
- template<typename A = int, typename B = double, typename C = string>
- void fun (void) {
- cout << typeid (A).name () << ' ' << typeid (B).name () << ' ' << typeid (C).name () << endl;
- }
- template<typename T = int>
- void bar (T arg) {
- cout << typeid (arg).name () << endl;
- }
- int main (void) {
- X<char, short, long>::foo (); // c s l
- X<char, short>::foo (); // c s Ss
- X<char>::foo (); // c d Ss
- // X<>::foo (); // i d Ss
- foo (100);
- // PUSH ... 100
- // PUSH ... _x
- Y<long long>::foo ();
- // Y<>::foo ();
- fun<char, short, long> ();
- fun<char, short> ();
- fun<char> ();
- fun<> ();
- fun ();
- bar (1.23);
- return 0;
- }
- #include <iostream>
- #include <iomanip>
- using namespace std;
- template<typename T = int, size_t S = 3>
- class Array {
- public:
- T& operator[] (size_t i) { return m_a[i]; }
- T const& operator[] (size_t i) const { return const_cast<Array&> (*this)[i]; }
- T m_a[S];
- };
- int square (int x) { return x * x; }
- template<int x> int square (void) {
- return x * x;
- }
- /*
- int square (void) { return 100;}
- */
- int main (void) {
- Array<int> a;
- /*
- a.m_a[0] = 10;
- a.m_a[1] = 20;
- a.m_a[2] = 30;
- */
- a[0] = 10; // a.operator[] (0) = 10;
- a[1] = 20;
- a[2] = 30;
- Array<int> const b = a;
- // cout << b.m_a[0] << ' ' << b.m_a[1] << ' ' << b.m_a[2] << endl;
- cout << b[0] << ' ' << b[1] << ' ' << b[2] << endl;
- Array<string> c;
- c[0] = "北京";
- c[1] = "上海";
- c[2] = "广州";
- cout << c[0] << ' ' << c[1] << ' ' << c[2] << endl;
- int const /*volatile */x = 2, y = 1;
- Array<Array<int, x+y+1>, 1+1+1> d;
- // Array<Array<int, 2+1+1>, 1+1+1> d;
- for (int i = 0; i < 3; ++i)
- for (int j = 0; j < 4; ++j)
- d[i][j] = i * 4 + j + 1;
- // d.operator[](i).operator[](j) = ...;
- for (int i = 0; i < 3; ++i) {
- for (int j = 0; j < 4; ++j)
- cout << setw (2) << d[i][j] << ' ';
- cout << endl;
- }
- Array<Array<Array<int> > > e;
- cout << square (10) << endl;
- cout << square<10> () << endl;
- return 0;
- }
class关键字:1)声明类 2)声明模板的类型实参typename关键字:1)解决嵌套依赖 2)声明模板的类型参数struct关键字:声明类
- #include <iostream>
- using namespace std;
- class A {
- public:
- typedef unsigned int uint;
- class B {};
- };
- template<typename T> void foo (void) {
- typename T::uint u;
- typename T::B b;
- }
- void bar (void) {}
- int main (void) {
- A::uint u;
- A::B b;
- foo<A> ();
- return 0;
- }
- #include <iostream>
- #include <typeinfo>
- using namespace std;
- template<typename T> class A {
- public:
- // 嵌套模板函数
- template<typename U>
- void foo (void) const {
- U var;
- cout << typeid (m_var).name () << ' ' << typeid (var).name () << endl;
- }
- private:
- T m_var;
- };
- template<typename T> void bar (T const& a, T const* b) {
- a.template foo<double> ();
- b->template foo<double> ();
- }
- int main (void) {
- A<int> a;
- a.foo<double> ();
- bar (a, &a);
- return 0;
- }
- #include <cstdlib>
- #include <iostream>
- using namespace std;
- class A {
- public:
- int m_var;
- void foo (void) const {}
- class X {};
- };
- class B : public A {
- public:
- void bar (void) const {
- cout << /*A::*/m_var << endl;
- /*A::*/foo ();
- /*A::*/X x;
- }
- };
- template<typename T>
- class C {
- public:
- int m_var;
- void foo (void) const {}
- class X {};
- void exit (int status) const {
- cout << "再见!" << endl;
- }
- };
- template<typename T>
- class D : public C<T> {
- public:
- void bar (void) const {
- // cout << C<T>::m_var << endl;
- cout << this->m_var << endl;
- // C<T>::foo ();
- this->foo ();
- typename C<T>::X x;
- // C<T>::exit (0);
- this->exit (0);
- }
- };
- int main (void) {
- B b;
- b.bar ();
- D<int> d;
- d.bar ();
- return 0;
- }
- #include <iostream>
- using namespace std;
- template<typename T> class Array {
- public:
- void pushBack (T const& data) {
- cout << "向数组尾端压入数据" << endl;
- }
- void popBack (void) {
- cout << "从数组尾端弹出数据" << endl;
- }
- };
- template<typename T> class List {
- public:
- void pushBack (T const& data) {
- cout << "向链表尾端压入数据" << endl;
- }
- void popBack (void) {
- cout << "从链表尾端弹出数据" << endl;
- }
- };
- template<typename T,template<typename> class C> class Stack {
- public:
- void push (T const& data) {
- m_c.pushBack (data);
- }
- void pop (void) {
- m_c.popBack ();
- }
- private:
- C<T> m_c;
- };
- int main (void) {
- Stack<int, Array> sia;
- sia.push (100);
- sia.pop ();
- Stack<int, List> sil;
- sil.push (200);
- sil.pop ();
- return 0;
- }
- #include <iostream>
- using namespace std;
- template<typename T>
- void foo (void) {
- T var = T ();
- // int var = int ();
- // string var = string ();
- // Integer var = Integer ();
- cout << '[' << var << ']' << endl;
- }
- template<typename T>
- class Foo {
- public:
- Foo (void) : m_var () {}
- T m_var;
- };
- class Integer {
- public:
- Integer (int arg = 0) : m_var (arg) {}
- friend ostream& operator<< (ostream& os,Integer const& i) {
- return os << i.m_var;
- }
- private:
- int m_var;
- };
- int main (void) {
- /*
- foo<int> ();
- foo<string> ();
- foo<Integer> ();
- */
- Foo<int> fi;
- cout << '[' << fi.m_var << ']'<< endl;
- Foo<string> fs;
- cout << '[' << fs.m_var << ']' << endl;
- Foo<Integer> fn;
- cout << '[' << fn.m_var << ']' << endl;
- return 0;
- }
不能被声明为虚函数的函数:全局函数,静态成员函数,构造函数,模板性成员函数
- #include <iostream>
- using namespace std;
- template<typename A, typename B>
- class X {
- public:
- // 模板中的虚函数
- virtual A foo (B arg) const {
- cout << "X::foo" << endl;
- return A ();
- }
- // 不可以声明虚模板函数
- /*
- template<typename C>
- virtual void bar (void) const {}
- */
- };
- template<typename A, typename B, typename C, typename D>
- class Y : public X<C, D> {
- public:
- A foo (B arg) const {
- cout << "Y::foo" << endl;
- return A ();
- }
- };
- int main (void) {
- Y<int, double, int, double> y1;
- X<int, double>& x1 = y1;
- x1.foo (1.2);
- Y<int, double, int, char> y2;
- X<int, char>& x2 = y2;
- x2.foo ('A');
- /*
- Y<int, double, char, double> y3;
- X<char, double>& x3 = y3;
- x3.foo (1.2); */
- return 0;
- }
C++STL - 模板的其他特性的更多相关文章
- 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系
2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...
- DLL中导出STL模板类的问题
接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...
- STL模板_容器概念
一.STL(Standard Template Library,标准模板库)概述1.容器:基于泛型的数据结构.2.算法:基于泛型的常用算法.3.迭代器:以泛型的方式访问容器中的元素,是泛型的算法可以应 ...
- c++ STL模板(一)
一.sort函数 1.头文件:#include < algorithm>: 2.它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n): 3.Sort函数有三个参数:(第三个参 ...
- STL模板整理 vector
一.什么是标准模板库(STL)? 1.C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板, ...
- C++面试笔记--STL模板与容器
1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vec ...
- C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...
- C++ STL模板
C++中的STL(Standard Template Library)用起来挺方便的,这里我们来做一下总结. 一.set set是STL中一种标准关联容器 (vector,list,string,de ...
- STL模板_智能指针概念
一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...
随机推荐
- C# GZip对字符串压缩和解压
/// <summary> /// 压缩方法 /// </summary> public static string CompressString(string str) { ...
- centos6搭建gitlab
前言 原来的项目放在公网的gitlab上,处于安全考虑,在内网搭建一套,有图形界面,可以直接从外网git导入进来,使用了一下觉得挺方便,把安装流程记录下来,参考官网:https://gitlab.co ...
- Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)
Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...
- Effective java笔记(四),泛型
泛型为集合提供了编译时类型检查. 23.不要在代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口统称为泛型.List<E>是一个参数化类,表示元素类型为E的列表.为了提供兼容性, ...
- 【非原创】IOS 验证文字是否是中文
从环信中找到的部分不错的代码,拿出来记录一下 是否是中文 -(BOOL)isChinese{ NSString *match=@"(^[\u4e00-\u9fa5]+$)"; NS ...
- Redis修改数据多线程并发—Redis并发锁
本文版权归博客园和作者本人吴双共同所有 .转载爬虫请注明地址,博客园蜗牛 http://www.cnblogs.com/tdws/p/5712835.html 蜗牛Redis系列文章目录http:// ...
- 【C#】New操作符所做的事情
1.它计算类型以及所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数.堆上的每个对象都需要一些额外的成员---即“类型对象指针”和“同步块索引 ...
- php中的登陆login
Login <?php require "../include/DBClass.php"; $username=$_POST['UserName']; $password=$ ...
- Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)
简介 ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...
- SQL Server:APPLY表运算符
SQL Server 2005(含)以上版本,新增了APPLY表运算,为我们日常查询带来了极大的方便. 新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表 ...