欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

【C++模板】特化与偏特化 template [partial] specialization

发布时间:2023/11/29 c/c++ 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【C++模板】特化与偏特化 template [partial] specialization 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1 template specialization 模板特化

一般情况下类模板定义如下:

template<class Window, class Controller> class Widget {... 泛化实现代码 ... }; 特化是指把类模板中指定的class T变成具体的类型:

class Widget<ModalDialog, MyController> {... 特化实现代码 ... }; 其中ModalDialog和MyController是你自己另外定义的类.
有了这个Widget的特化定义之后,如果你以后定义了Widget<ModalDialog, MyController>对象时,编译器就会使用上述的特化定义.
如果定义了其它泛型对象,那么编译器就是用原本的泛化定义.
这就是模板的特化.

2 template partial specialization 模板偏特化

模板特化是通过"给模板中的所有模板参数一个具体的类"的方式来实现的.而模板偏特化则是通过"给模板中的部分模板参数以具体的类,而留下剩余的模板参数仍然使用原来的泛化定义"的方式来实现的.

template<class Window> //仍然使用原来的泛化定义; class Widget<Window, MyController> //MyController是具体的类,是特化定义; {... 偏特化实现代码 ... }; 模板的偏特化能力很强大.当你实例化一个模板时,编译器会把目前存在的偏特化模板和全特化模板做比较,并找出其中最合适、最匹配的实现.
这样,灵活性就很大.
模板的偏特化机制不能用在函数身上,不论成员函数还是非成员函数.

3 注意

  • 虽然你可以全特化类模板中的成员函数,但是你不能偏特化他们;
  • 你不能偏特化命名空间级别(namespace-level)的函数(non-member).最接近"命名空间级别模板函数"的偏特化机制就是函数重载,那就意味着你对"函数参数"(而非返回值类型或内部所用类型)有很精致的特化能力;
  • 特化或全特化时,template后面的尖括号中不带任何内容;
  • Author: visaya fan <visayafan[AT]gmail.com or visayafan[AT]163.com>

    Date: 2011-10-21 17:30:04

    HTML generated by org-mode 6.33x in emacs 23

    总结

    以上是生活随笔为你收集整理的【C++模板】特化与偏特化 template [partial] specialization的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。