C++ POD类型萃取

2017-07-20 11:54 阅读 226 次 评论 0 条
类型萃取依靠的就是模板的特化,模板的特化又分为全特化与偏特化,对于编译器来说,如果你对某一功能有更好的实现,那么就应该使用你的特化版本。

函数模板特化

函数模板只有全特化,而没有偏特化。至于为什么没有偏特化,原因在于已经有了函数重载,偏特化也没什么用。

有时候并不总是能够写出对所有可能被实例化的类型都合适的模板,在某些情况下,通用模板定 义对于某个类型可能是完全错误的,或者不能编译,或者做一些错误的事情。比如下面比较字符串的程序:

当函数模板不能解决一些问题的时候,我们引入了模板函数特化。模板函数特化形式如下

1)关键字template后面接一对空的尖括号<> 。

2)函数名后接模板名和一对尖括号,尖括号中指定这个特化定义的模板形参。

3)函数形参表

4)函数体

注意:在模板特化版本的调用中,实参类型必须与特化版本函数的形参类型完全匹配,如果不匹配,编译器将为实参模板定义中实例化一个实例。

注意:特化不能出现在模板实例的调用之后,应该在头文件中包含模板特化的声明,然后使用该特化版本的每个源文件包含该头文件。

类模板的全特化与偏特化

全特化与偏特化是相当于类模板而言的。全特化是限定死模板实现的具体类型,而偏特化是针对于当模板有多个类型时,限定了其中的一部分。

下面程序是一个模板类的全特化过程,我将它的模板类型分别限定为int、float:

模板类型T1与T2明确化化后,当我们实例化对象时,程序自然会去调用这个全特化的类 。一个类被称为全特化的条件:

下面是偏特化过程,在它的模板类型中,存在部分未被明确化的类型:

我们仅对其中一个模板类型明确化,且存在一个未被明确的类型,这就是偏特化。一个类被称为偏特化的条件:

注意:对于主模板类、全特化类、偏特化类的调用优先级的次序为:

内置类型的特化场景

当我们使用STL顺序表时,当类型为内置类型时会调用realloc开辟空间,但是,当类型为自定义类型时,调用realloc显然是不可以的,这时就应该调用new来实现。

在STL中的Destroy算法根据函数的参数类型的特性:是否具有trivial destructor来选择对应的策略来进行destroy,如果是内置类型,则不调用该类型的destructor,否则对迭代器范围内的对象调用destructor来进行destroy。

总结:类型萃取是在模板的基础上区分内置类型与自定义类型的,即将内置类型全部特化,然后再进行区分。

POD类型萃取举例

下列程序中,我们利用C++类型萃取的技巧,可以将内置类型与自定义类型区分开来,然后对内置类型采用memcpy的方式进行拷贝,对自定义类型使用for循环拷贝。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:C++ POD类型萃取 | 术与道的分享
分类:编程素养 标签:, ,
1024do.com导航_术与道导航平台

发表评论


表情