注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路

To find the final symmetry & beauty

 
 
 

日志

 
 
 
 

什么是function template partial order(偏序模板函数)[原创]  

2011-02-14 19:44:43|  分类: c++学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这里说的不是类模板的偏特化,而是偏序函数模板。这个特性在C++标准中并不太明确,各家编译器对它个特性的工作细节可能会有些差异。

先来看看一个例子:

 

//filename:function_partial_order.cpp

//wirtten by saturnman

#include<iostream>

using namespace std;

//function template partial order feature

template<typename T>

void func1(T t)

{

    cout<<"func1 1"<<endl;

}

 

template<typename T>

void func1(T* t)

{

    cout<<"func1 2"<<endl;

}

 

template<typename T>

void func2(T t)

{

    cout<<"func2"<<endl;

}

int main()

{

    //test function template partial order

    cout<<"test function template partial order."<<endl;

    int param1 = 10;

    int* param2 = NULL;

    func1(param1);

    func1(param2);

   

    func2(param1);

    func2(param2);

    return 0;

}

 

上例中对func1有两个重载的模板函数,而对func2只有一个模板函数,我使用一个整数和一个指向整数的指针分别调用func1和func2,注意param1和param2对于func1的第一个定义都是合适的,当然对于func2也是合适的。但是param1对于func1的第二个定义并不合适,param2对于func1的第二个定义是合适的。我们先来查看运行结果

对于第一个函数func1的调用显然是调用了不同的模板函数,这里就有一个谁比谁更特化和谁比谁更一般化的比较规则,更加特化的当然会被优先选择。

这里就有一个所谓的正序规则(Formal Ordering Rules):

1.    Replace each template type parameter with a unique "made up" type.

2.    Replace each template template parameter with a unique "made up" class template.

3.    Replace each nontype template parameter with a unique "made up" value of the appropriate type.

这几句的意思是这样的,编译器片段两个函数模板谁比谁更特化的方法是尝试,编译器自己生成内部类型A,把它分别代入函数func1的模板,比如编译器如下构造{A a}现在就有了如下两个函数

func1(a); //这个利用第一个模板代入

func1(a*);//这个利用第二个模板代入

现在编译器把这两个反向,把a代码第二个模板,把a*代入第一个模板,显然第一个模板函数是可以接受指针类型的,让T为a*就可以了,但是第二个模板函数不能接收a,因为它的参数必须是一个指针。由此编译器知道第一个函数模板比第二个函数模板更加泛化,也就是说第二个函数模板比第一个函数模板更加特化。因此调用会优先选择更加特化的模板,因此出现上面的结果。

Ref:

《C++ Templates: The Complete Guide》

  评论这张
 
阅读(1065)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017