effective C++学习

来源:互联网 发布:python string strip 编辑:程序博客网 时间:2024/09/21 09:05

    前几天看template没看明白,今天将template重新看了一遍,才发现以前对于template的认识实在太肤浅了。不用说对template的元编程这种东西孤陋寡闻,就连一些template的常用编程方法也都没有用过。
    其实之前的也说了,template是编译时确定的多态,而virutal关键字修饰的类成员函数是在运行时实现多态。这两种实现多态方式的差异,直接导致的是在编写template为基础的程序时运用的思维方式和在编写以base class-derived class形势为代表的集成体系所实现的多态有着根本的不同。这表现在很多方面,首先就是在template编程中继承变得小心起来。也就是derived class不能直接调用base class的template public成员。这是因为在template编程中,可以声明一种叫special version template class,在这种类中的成员函数肯能和普通的template base class中所拥有的函数完全不同。所以当编译器遇到这种类时,就会采取保守的策略,默认自己找不到base class中对应的成员函数。除非写程序的人自己保证这样的函数是存在的。可以通过this指针,using关键字指定或者时直接用范围限定符::来指明要调用的函数。在一个template类的继承体系之间赋值也没有不用template时那么方便。比如有一个base class A和derived class B,如果不用template特性的话,可以将B的指针复制给A类型的指针,即A* sample = new B; 但是如果使用了tempalte特性的话,就不能随便这么做了,除非你在A的赋值构造函数中也使用template特性这才可以。就连运算符重载也说道多多,如果你要声明一个non-member operator来处理两个template类的运算的话,必须要将这个函数申请为template类的友员,然后在必须在类内部实现这个函数。可以通过外附函数的方法来减少这个函数的实现代码,也就是在这个友员函数的实现中调用一个类外的non-member函数。
    在运用template特性的时候要注意代码的膨胀,这是因为有时会用到non-type parameter。而处理的方法就是将non-type parameter提出来,在作为参数传给要使用这个参数的函数。
 trait辅助类比较变态,就不说了,因为要说清楚一句两句也不太可能。
        其实我感觉template的很多特性如果不帖代码的话是很难说清的,这里没有贴,所以讲的不是很清楚,以后有时间再补上吧。

原创粉丝点击