随笔 - 45  文章 - 129  trackbacks - 0
<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

专注于C++ P2P STL GP OpenSource等
Google

常用链接

留言簿(10)

随笔分类

随笔档案

相册

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜

Partial Template Specialization
顾名思义,模版偏特化就是对模版进行特化的意思。

举个例子:
namespace SHFTest
{
    template
<
            
class PLA,
            
class PLB
            
>
    
class PLClass
    
{
        
//
        
// 一般实现
        
//
    public:
        PLClass()
{};
        
~PLClass(){};
        
void FuncA()
        
{
        }

    }
;

    typedef myPLA;
    typedef myPLB;

    
//
    
// 单参数特化实现,参数A
    
//
    template<class PLA>
    
class PLClass<PLA,myPLB>
    
{
        
//
        
// 特化实现
        
//
        PLClass(){};
        
~PLClass(){};
        
void FuncA()
        
{
        }

    }
;

    
//
    
// 单参数特化实现,参数B
    
//
    template<class PLB>
    
class PLClass<myPLA,PLB>
    
{
        
//
        
// 特化实现
        
//
        PLClass(){};
        
~PLClass(){};
        
void FuncA()
        
{
        }

    }
;

    
//
    
// 双参数特化实现
    
//
    template<>
    
class PLClass<myPLA,myPLB>
    
{
        
//
        
// 特化实现
        
//
        PLClass(){};
        
~PLClass(){};
        
void FuncA()
        
{
        }

    }
;
}

 第一段代码是一个普通的template class,支持两个模板参数。

假如我对于某种对象,需要做特殊化的处理,这样就要用到模版偏特化了:
例如第二段代码,第三段代码,第四段代码分别对参数A,参数B和两个参数做了偏特化。

编译器会帮你的代码自动匹配到最好的模板上面进行实例化。

这个有点类似于函数的重载,但是和重载是不一样的,根据《深入探索C++对象模型》中的描述,函数重载会在运行时发生,利用函数对象忠的vtable来实现的。而模版偏特化发生在编译期间,由编译器来自动匹配完成的。没有运行时的开销。

注意几点:
你能对已经做过偏特化的class忠的成员函数做偏特化,而你想单独对某个函数做偏特化这是不允许的。请看以下例子:
这样是被允许的:
namespace SHFTest
{
    template
<
            
class PLA,
            
class PLB
            
>
    
class PLClass
    
{
        
//
        
// 一般实现
        
//
    public:
        PLClass()
{};
        
~PLClass(){};
        
void FuncA(){};
    }
;

    typedef myPLA;
    typedef myPLB;

    
//
    
// 单参数特化实现,参数A
    
//
    template<class PLA>
    
class PLClass<PLA,myPLB>
    
{
        
//
        
// 特化实现
        
//
        PLClass(){};
        
~PLClass(){};
        
void FuncA();
    }
;

    template
<class PLA>
    
void PLClass<PLA,myPLB>::FuncA()
    
{

    }

}
而下面的这种情况是不允许的,编译不过的:
namespace SHFTest
{
    template
<
            
class PLA,
            
class PLB
            
>
    
class PLClass
    
{
        
//
        
// 一般实现
        
//
    public:
        PLClass()
{};
        
~PLClass(){};
        
void FuncA();
    }
;

    typedef myPLA;
    typedef myPLB;

    template
<class PLA>
    
void PLClass<PLA,myPLB>::FuncA()
    
{

    }

}
当然直接偏特化namespace级别的函数也是不被允许的。你可以对这些函数做重载。这就意味着你只能更改函数的参数列表而不能改变函数的返回类型等。
请看以下代码:
template <class T, class U> T Fun(U obj); 
//primary template
template <class U> void Fun<void, U>(U obj); 
//illegal partial specialization
template <class T> T Fun (Window obj); 
//legal (overloading)

写得不好,还请大家指正。
posted on 2006-12-30 17:30 CPP&&设计模式小屋 阅读(4036) 评论(3)  编辑 收藏 引用 所属分类: Modern C++ Design,BOOST,LOKI读书笔记

FeedBack:
# re: 模版偏特化--Partial Template Specialization(《Modern C++ Design读书笔记二》) 2007-09-16 15:57 张卫华
修改函数的返回值和参数,只是覆盖,不是重载  回复  更多评论
  
# re: 模版偏特化--Partial Template Specialization(《Modern C++ Design读书笔记二》) 2008-01-07 14:23 Gino
> 这个有点类似于函数的重载,但是和重载是不一样的,根据《深度探索C++对
> 象模型》中的描述,函数重载会在运行时发生,利用函数对象忠的vtable来
> 实现的。

函数重载为什么会在运行时发生?

我很疑惑你的看法。我没有在《深度探索C++对象模型》中找到对应的话,(几个月前刚看过,也许我漏掉了。)

重载只是一个对C++程序员来讲有意义的名词,但解释后的C代码中,根本就没有这个概念。

重载函数/方法会被静态绑定(编译期绑定)。  回复  更多评论
  
# re: 模版偏特化--Partial Template Specialization(《Modern C++ Design读书笔记二》) 2008-01-08 11:36 风舞影天
@Gino
我认为楼主说的应该是继承而非重载,估计他把重载和继承的概念混淆了或是记错了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理