C++ 模板

月考之后,再写一篇

 

模板是C++中十分重要的部分,也是体现C++相较于C语言的优势之处。

由模板延伸出来了一种极其强大的算法——泛型算法(无论类型是什么,程序都可以通过几个类型的共有的,通用的使用方式来执行一些操作),这种强大的算法后面会介绍。

模板的一个例子:

template<typename __Tp>
    class BIGNUM{

    };

template<typename __Tp>
    void construct(__Tp a,const __Tp b){

    };

也就是说,模板可以使用在类和函数上面。

那么,我们为甚么要使用模板呢?

 

那就讲一个故事吧>_<

从前,有一个十分可怜的使用C语言的程序员怪蜀黍。

他在开发一个A+B的程序。(好简单耶!!!)

他敲出了子函数代码:

int add(int a,int b)
{
    return a+b;
}

可是,他还不满足于此。

万一类型是double???

那就再写一个:

double add(double a,double b)
{
    return a+b;
}

可是他发现一个问题:两个函数的名字都是add

而C语言并不支持两个同名函数在同一作用域(就是那个重载函数)(C编译器真是无能)

所以这个老大哥转行去C++了(C++编译器支持)(C++会心一笑 ^ \/ ^ )

可是还要实现其他类型的add函数怎么办?

他想到了预处理宏:

#define ADD(type)\
type add(type a,type b)\
{\
   return a+b;\
}

ADD(int)
ADD(char)
ADD(double)

可是他还是不满足呀。

因为每一次要使用XX类型的函数,都要重新声明。

于是,他学习了模板。

请出模板大神(大家鼓掌/\ /\ /\)

template<typename __Tp>
__Tp add(__Tp a,__Tp b)
{
    return a+b;
}

这样,他就把审查变量类型的事情交给了编译器。

编译器会在使用这个函数的地方利用传入参数的类型来推断__Tp代表着什么。

这个故事完。

我们如何调用这个函数?

int main(){
    int c,d;
    //do_sth;
    add(c,d);
}
    

也可以显明地告诉编译器我们参数的类型,以便执行强制类型转换:

int main()
{
    int c,d;
    //do_sth
    add<int>(c,d);
}    

 

我们也可以写一个使用模板的类(简称模板类)

template<typename>class ...;

但是,因为我们可爱的编译器不能自主推断加入模板的参数类型,所以需要我们显明地指定类型。

posted @ 2019-04-05 10:12  Colin-Wang  阅读(395)  评论(0编辑  收藏  举报