您的位置:首页 > 编程语言 > C语言/C++

C++ template学习笔记之杂七杂八

2011-05-27 13:08 183 查看
1.缺省模板实


“对于类模板,你还可以为模板参数定义缺省值,这些值就被称为缺省模板实参。而且,它们还可以引用之前的模板参数。”

//还可以这样用模板

template<class T1, class T2 = vector<T1> >

class MyVector

{

//........................

};


//还可以这样用模板。

//还可以这样用模板

template<class T1, int maxSize >

class Stack

{


//.............

};


"我们还应该知道,非类型模板参数是有限制的。通常而言,它们可以是常整数,或都指向外部链接对象的指针。
"

浮点数和类对象是不允许作为非类型模板参数的。


2.关键字typename

“关键字typename:

C++
标准化过程中,引入关键字
typename
是为了说明:模板内部的标识符可以是一个类型。”

即模板参数类型(T)
可以可以是一个类类型
(OneClass)
,这样就可以用模板类型
(T)
引用它的类类型内部的成员了。



//此例仅为说明问题。


#include   <iostream>   
using namespace std;
class Big
{
public:
	void Print()
	{
		cout << "big" << endl;
	}
class Small
{
public:
	void Print()
	{
		cout << "small" << endl;
	}
};
	Small sl;
};
template<class T> void Print(T & t)
{
	t.Print();
	typename T::Small * slPtr;
	slPtr = &t.sl;
	slPtr->Print();
}
void main()   
{     
	Big bg;
	Print(bg);
}



3.

类模板与

模板类

http://blog.csdn.net/justin12zhu/archive/2009/02/15/3893422.aspx
"模板类是类模板实例化后的一个产物。说个形象点的例子吧。我把类模板比作一个做饼干同的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道 的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了。"


4.
成员模板

//http://www.cnblogs.com/rawu/archive/2006/07/14/450276.html
#include<typeinfo> 
#include<iostream> 
template <typename T> 
class Myclass 
{ 
public: 
	template <typename T1> //成员模板
	void PrintTypeName(T thistype,T1 const othertype);
};
template <typename T>
template <typename T1>  //定义
void Myclass<T>::PrintTypeName(T thistype,T1 const othertype)
{
	
	std::cout<<"thistype is "<<typeid(thistype).name()
		<<",othertype is "<<typeid(othertype).name()<<std::endl;
}
int main(void)
{
	Myclass<int> x ;
	x.PrintTypeName(10,"hahahah");
	x.PrintTypeName(10,10.1);
	x.PrintTypeName(10,false);
	std::cin.get();
}
//结果显示
//thistype is int , othertype is char const*
//thistype is int , othertype is double
//thistype is int , othertype is bool




还有“
模板的模板参数
”,还是别折腾编译器了。

5.
类模板的声明

//Number.h
#include <iostream>
using namespace std;
template<class T> 
class Number;
template<class T> 
void print(Number<T> n);
template<class T> 
class Number
{
public:
	T t;
};
template<class T> 
void print(Number<T> n)
{
	cout << n.t << endl;
}
// main.cpp
#include "Number.h"
int main(void)
{
	Number<int> i;
	i.t = 9;
	print(i);
	system("pause");
}




结果
:9


6.
模板实例化
http://zh.wikipedia.org/wiki/%E6%A8%A1%E6%9D%BF_%28C%2B%2B%29
模板实例化(template instantiation
)是指在编译或链接时生成函数模板或类模板的具体实例源代码。
ISO C++
定义了两种模板实例化方法:隐式实例化(当使用实例化的模板时自动地在当前代码单元之前插入模板的实例化代码)、显示实例化(直接声明模板实例化)。在
C++
语言的不同实现中,模板编译模式(模板初始化的方法)大致可分为三种:


Borland模型(包含模板编译模式):编译器生成每个编译单元中遇到的所有的模板实例,并存放在相应的目标文件中;链接器合并相同的模板实例,生成可执行文件。为了在每次模板实例化时模板的定义都是可见的,模板的声明与定义放在同一个
.h
文件中。这种方法的优点是链接器只需要处理目标文件;这种方法的缺点是由于模板实例被重复编译,编译时间被加长了,而且不能使用系统的链接器,需重新设计链接器。

Cfront/查询模型(分离
(Separation)
模板编译模式):
AT&T
公司的
C++
编译器
Cfront
为解决模板实例化问题,增加了一个模板仓库,用以存放模板实例的代码并可被自动维护。当生成一个目标文件时,编译器把遇到的模板定义与当前可生成的模板实例存放到模板仓库中。链接时,链接器的包装程序(
wrapper
)首先调用编译器生成所有需要的且不在模板仓库中的模板实例。这种方法的优点是编译速度得到了优化,而且可以直接使用系统的链接器;这种方法的缺点是复杂度大大增加,更容易出错。使用这种模型的源程序通常把模板声明与非内联的模板成员分别放在
.h
文件与模板定义文件中,后者单独编译。

混合(迭代)模型:g++
目前是基于
Borland
模型完成模板实例化。
g++
未来将实现混合模型的模板实例化,即编译器把编译单元中的模板定义与遇到的当前可实现的模板实例存放在相应的目标文件中;链接器的包装程序(
wrapper
)调用编译器生成所需的目前还没有实例化的模板实例;链接器合并所有相同的模板实例。使用这种模型的源程序通常把模板声明与非内联的模板成员分别放在
.h
文件与模板定义文件中,后者单独编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: