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.为了表现出和普通指针一 ...
随机推荐
- (转载)构建public APIs与CORS
from: https://segmentfault.com/a/1190000000709909 理由:在操作层面详细的讲解了跨域的操作.尤其是对于option请求的详解.收藏. 在构建Public ...
- Linux上的SQL Server——预告片
大家可能都听说了,微软在几个星期前宣布发布可以在Linux上完整运行的SQL Server!如果你想看下在Linux上SQL Server如何运行,进行查询是什么样的体验,可以看下下面的视频.
- Halcon11与VS2010联合开发
刚开始学习Halcon,需要使用Halcon与C++联合开发软件,查了网上的资料都是Halcon10的,我用的是Halcon11和VS2010的开发环境,实践了一下发现有一些问题,于是把自己的配置的过 ...
- 使用fiddler的autoResponder及设置手机端代理实现远程调试,出现的问题及解决办法
这是开通博客的第一篇随笔,好鸡冻哈哈o_O 首先是下载安装,我安装的是最新的v4.6.2.0版本,大家在百度上搜fidddler4在百度软件中心普通下载就可以了.或者直接用这个连接:http://dl ...
- C#之tcp自动更新程序
.NETTCP自动更新程序有如下几步骤: 第一步:服务端开启监听 ServiceHost host; private void button1_Click(object sender, EventAr ...
- 使用MyEclipse 开发struts2框架结构详细教程——以登录为例
1.首先建立Web Project,名称为:struts2 ,然后选择Java EE6.0,点击Finish. 2.右击“struts”选择MyEclipse->Add Struts Capab ...
- An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
使用EF对建立了关系的表新增记录时出现: An entity object cannot be referenced by multiple instances of IEntityChangeTra ...
- 纯CSS3实现3D跳动小球
请使用Chrome,火狐的浏览器查看本页面,使用IE将看不到效果.如果在本页看不到一个跳动的小球,请确定您的浏览器支持CSS3,或者访问http://keleyi.com/a/bjac/iphgrtq ...
- 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制
推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...
- OO方式下,ALV TREE和ALV GRID的不同之处
作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...