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.为了表现出和普通指针一 ...
随机推荐
- 小白Linux入门 四
http://edu.51cto.com/lesson/id-11372.html 28了 文件管理类命令 目录: mkdir mkdir /tmp/x mkdir -p /tmp/a/b -pv b ...
- 你的程序支持复杂的时间调度嘛?如约而来的 java 版本
你的程序支持复杂的时间调度嘛? 这篇文章介绍了时间适配器的c#版本,是给客户端用的,服务器自然也要有一套对应的做法,java版本的 [年][月][日][星期][时间] [*][*][*][*][*] ...
- How PhoneGap & Titanium Works
转载自 http://www.appcelerator.com/blog/2012/05/comparing-titanium-and-phonegap/ How PhoneGap Works As ...
- 关于JavaScript变量提升的理解
废话不说,直接上代码(这是在JavaScript面对对象编程指南上面看到的一个例子) var a=123; function f(){ alert(a); var a=1; alert(a); } f ...
- 【MVVM Light】新手初识MVVM,你一看就会
一.前言 作为一个初入软件业的新手,各种设计模式与框架对我是眼花缭乱的.所以当我接触到这些新知识的时候就希望自己能总结几个步骤,以便更好更方便的在日常工作中进行使用. MVVM顾名思义就是Model- ...
- EFCore执行Sql语句的方法:FromSql与ExecuteSqlCommand
前言 在EFCore中执行Sql语句的方法为:FromSql与ExecuteSqlCommand:在EF6中的为SqlQuery与ExecuteSqlCommand,而FromSql和SqlQuery ...
- 设计模式(四)抽象工厂模式(Abstract Factory Pattern)
一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建 ...
- 详解Spring框架AOP(面向切面编程)
最近在学习AOP,之前一直很不明白,什么是AOP?为什么要使用AOP,它有什么作用?学完之后有一点小小的感触和自己的理解,所以在这里呢就跟大家一起分享一下 AOP(Aspect-Oriented Pr ...
- PHP中return 和 exit 、break和contiue 区别与用法
先说一下exit函数的用法. 作用: 输出一则消息并且终止当前脚本. 如果一段文本中包括多个以 结束的脚本,则exit退出当前所在脚本. 比如一篇php文本包括一下代码,则输出为world. < ...
- java Io流输出指定文件的内容
package com.hp.io; import java.io.*; public class BufferedReaderTest{ /** *@param 想想 */ public st ...