模板的特化和偏特化

       模板在C++中可谓是一个极其重要的特性,可谓是构成C++设计思想的灵魂部分,所谓的泛型编程就是模版的一种体现。但是呢,作为C++如此重要的特性,其实在平时工作当中用到的并不多。或者说我们平时工作只用到了其中的一部分,而其实模板的内容也很丰富。例如,被程序员广为使用的STL其内在的实现方式就充斥着大量的模板使用。不过,毕竟STL这种东西平时程序员也不会去自己实现它吧。

       模板有几个主要的概念,类模板,函数模板,模板特化,模板偏特化,模板实例化。这几个概念其实是很容易混淆的。使用的时候也需要特别注意。

       函数模板:当我们的函数功能类似,而只是其中处理的数据类型不同时,我们就可以采用函数模板。从而实现代码复用。具体格式如 template <typename T,...>或 template<class T,...> ,可以有多个参数,甚至是另一个模版

       类模版:顾名思义,就是当一个类要实现的功能只是因为数据类型不同,而需要进行多个类的设计的时候,我们就往往需要将这个类设计成一个模版类。而这个模版就是类模版。具体格式如template<typename T> 或template <class T>,可以有多个参数,甚至是另一个模版

       模版的特化:模版的特化和模版的实例化是有所区别的。

       模版的实例化是指在编译过程中,制定模版当前所表示的具体的数据类型,当然,与之相对应的则是类的实例化,类的实例化是在运行过程中的。这里是有所区别的。由于模版的实例化是需要编译器根据相关规则进行推导的,所以为了避免软件的运行负担,都会将这部分工作在编译过程中进行完成。这个就是模版实例化的过程。

       而模版的特化,则是发生在比编译过程更早的模版定义的过程中。即在模版定义的过程中,就针对某一种数据类型的特殊性,进行设定的类模版。例如

// 定义类的模版
template <class T>
class Demo{};
//针对bool型数据,进行的模版的特话
template <>
class  Demo<bool>{
};
            从而我们知道了一个时间的顺序,模版的特化发生在定义时期,模版的实例化发生爱编译时期,类的实例化发生在运行时起。

        模版的偏特化从类模版的特化中去了解偏特化,就相对要容易一点。由于模版是存在一个模版参数列表的,而当模版参数列表的参数不止一个,而特化过程中,针对模版参数列表中的某一部分进行特化,这个过程就称为模版的偏特化。具体如

// 定义类的模版,两个模版参数
template <class T,class N>
class Demo{};
//针对bool型进行便特化,其他的参数仍需定义模版
template <class T> //定义非特化的模版参数

class  Demo<T,bool>{// 定义特化为bool型的模版类,仍旧为模版类
};


        模版的实例化的示例代码如下:

    std::cout << "Hello, World!\n";
    Demo<int,bool> demoA;// 具体定义一个类就是模版的实例化了

        当然,模版还有很多极为灵活和巧妙的用法,而且也远比其他语言更有设计哲学,但是也正因为如此才造成了C ++模版的艰涩难懂,而博主现在也只是对这些概念和定义有所掌握,对于更为深层次的东西,依然需要探索。



猜你喜欢

转载自blog.csdn.net/helinlin007/article/details/51258823
今日推荐