文章目录
参考
c++ 模板
一、模板函数(compare)
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector 。
您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。
一般模板函数
我们举一个简单的例子(比较两个数的大小)
template<class Type>
int compare(const Type& v1, const Type& v2)
{
if(v1<v2) return -1;
if(v1>v2) return 1 ;
else return 0;
}
我们想用同一个函数让它既能比较浮点数的大小又能比较整型数的大小,而不用通过重载重复写同一份代码(浪费代码🤣),在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。
cout<<compare(1,2)<<endl;
cout<<compare(1.1,2.4)<<endl;
运行结果:
1
1
特化模板函数
但假如我们要比较的是字符串,那直接比较显然不合适,于是我们加入一个特化模板函数对字符串进行特殊处理
template<>
int compare<const char*>(const char * const &v1, const char * const &v2)
{
return strcmp(v1,v2);
}
然后进行测试
cout<<compare("hello","world")<<endl;
运行结果
1
二、模板类Queue或Stack
正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:
template <class type> class class-name {
.
.
.
}
其中中的``class也可用
typename替代,它们没有任何区别。C++ 早期对模板的支持并不严谨,没有引入新的关键字,而是用 class 来指明类型参数,但是
class关键字本来已经用在类的定义中了,这样做显得不太友好,所以后来 C++ 又引入了一个新的关键字
typename,专门用来定义类型参数。不过至今仍然有很多代码在使用
class`关键字,包括 C++ 标准库、一些开源程序等。
模板类(Queue)
类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有任何区别),后跟类型参数;类型参数不能为空,多个类型参数用逗号隔开。
如下我们定义一个队列
template<class Type> class Queue{
public:
Queue():head(0),tail(0){}
Queue(const Queue& q):head(0),tail(0){
copy_items(q);
}
template<class It>
Queue(It beg, It end):head(0),tail(0){copy_items(beg,end);}
templat