zoukankan      html  css  js  c++  java
  • 模版的特化与偏特化

     Partial Template Specialization能够让你在模板(Template)的所有可能的实体中特化出一组子集.

      1.模板(全)特化(template specialization):
        例如,定义如下的一个模板:

        template<class Window, class Controller>
        class Widget
        {
          ... 泛化实现代码 ...
        };

      然后你可以像下面那样明确地加以特化:

        template<>    //注意:template后面的尖括号中不带任何内容;
        class Widget<ModalDialog, MyController>
        {
          ... 特化实现代码 ...
        };

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

    2.Partial Template Specialization(模板偏特化)

      模板特化是通过"给模板中的所有模板参数一个具体的类"的方式来实现的.而模板偏特化则是通过"给模板中的部分模板参数以具体的类,而留下剩余的模板参数仍然使用原来的泛化定义"的方式来实现的;
        比如,就上面的Widget类模板的定义来说,有时候想针对任意的Window来搭配一个特定的MyController类特化Widget,这个时候就需要使用模板偏特化机制了.下面的Widget类模板就是Widget的偏特化定义:

        template<class Window>                        //仍然使用原来的泛化定义;
        class Widget<Window, MyController>            //MyController是具体的类,是特化定义;
        {
          ... 偏特化实现代码 ...
        };

    这就是一个偏特化定义;一个MyController类可以搭配任意一种Window.
        通常在一个类模板的偏特化定义中,你只会特化某些模板参数而留下其它泛化参数.当你在程序中具体实现上述类模板的时,编译器会试着找出最匹配的模板定义. 这个寻找过程十分复杂精细,允许你以富有创意的方式来进行偏特化.例如,假设你有一个Button类模板,它有一个模板参数,那么,你不但可以拿任意的 Window搭配特定的MyController来特化Widget,还可以拿任意Button搭配特定的MyController来偏特化 Widget:

        template<class ButtonArg>
        class Widget<Button<ButtonArg>, MyController>    //使用任意Button搭配具体的类MyContorller
        {
          ... 偏特化实现代码 ...
        };

      模板的偏特化能力很强大.当你实例化一个模板时,编译器会把目前存在的偏特化模板和全特化模板做比较,并找出其中最合适、最匹配的实现.这样,灵活性就很大.但是不幸的是,模板的偏特化机制不能用在函数身上,不论成员函数还是非成员函数.(一说是由于函数偏特化可以通过函数重载替换实现)

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

      总结:
        模板特化/全特化是指给每一个模板参数一个具体的类型,以具体实现这个模板,而且template后面的尖括号中不带任何内容;
        模板偏特化是指只给部分模板参数一个具体的类型,来实现这个模板;

     【转自】http://www.cnblogs.com/wanghetao/archive/2011/11/21/2257276.html

     

  • 相关阅读:
    大数据和云计算
    关于移动开发的一些讨论(在有些场合,移动就是噱头,胡乱鼓吹是不负责任的)
    软件开发设计中的两个误区
    【转】从底层了解ASP.NET体系结构
    DotNet命名规范参考(转)
    PAD会取代PC吗
    转:关于http server
    AOP 面向方面的编程 Aspect Oriented Programing --第一次听说呢,汗!
    关于字符集(讲的比较清楚的一片字符集科普文章)
    .NET vs JAVA
  • 原文地址:https://www.cnblogs.com/yyxt/p/4805336.html
Copyright © 2011-2022 走看看