1、函数模板
template <class T>
void foo(T param)
{
}
这里有几件事情需要注意 第一行代码里,在尖括号里有一个class T,用来告诉编译器:字母T将在接下来的函数里代表一种不确定的数据类型,当然T可以随便命名。 关键字class不是类的数据类型,而是一种约定俗成的说法,当然class也可以随便命名啦。
template<typename TI>
void swap(TI &a,TI &b)
{
TI temp = a;
a = b;
b = temp;
}
注意:不要把函数模板分成原型和实现两个部分。如果编译器看不到模板的完整代码,它就无法正确生成代码。所得到的出错信息乱七八糟。
为了明确表明swap()是一个函数模板,还可以用
swap<int>(a,b)
来调用这个函数。
2、类模板
template<typename T>
class Myclass
{
Myclass();
void swap(T &a,T &b);
}
注意:构造器的实现将是下面这样:
Myclass<T>::Myclass()
{
}
因为Myclass是一个类模板,所以不能只写出Myclass::Myclass(),编译器需要你在这里给出一种与Myclass()配合使用的数据类型,必须在尖括号里提供它,因为没有确定的数据类型可以提供,所以使用一个T作为占位符即可。
来个栗子
#include<iostream>
#include<string>
template<typename T>
class Stack
{
public:
stack(unsigned int size = 100);
~stack();
void push(T value);
T pop();
private:
unsigned omt size;
unsigned int sp;
T *data;
};
template<typename T>
Stack<T>::Stack(unsigned int size)
{
this->size = size;
data = new T[size];
sp=0;
}
template<typename T>
Stack<T>::~Stack()
{
delete []data;
}
template<typename T>
void Stack<T>::push(T value)
{
data[sp++] = value;
}
template<typename T>
T stack<T>::pop()
{
return data[--p];
}
int main()
{
Stack<int>instack(100);
intstack.push(1);
intstack.push(2);
intstack.push(3);
std::cout<<intstack.pop()<<std::endl;
std::cout<<intstack.pop()<<std::endl;
std::cout<<intstack.pop()<<std::endl;
return 0;
}
运行结果:3 2 1
注意:c++没有限制只能使用一个类型占位符,如果类模板需要一种以上的类型,根据具体情况多使用几个占位符即可。
template <typename T,typename U>
class Myclass
{
}
在实例化时,我们只需要这么做: Myclass<int,float>myclass;
3、内联函数inline
|