免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4824 | 回复: 6
打印 上一主题 下一主题

[C++] 有关函数模板特化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-28 16:10 |只看该作者 |倒序浏览
对于如下的模板函数:
template <typename T>
T max(T &a, T &b) {
  return a > b ? a : b;
}
在比较字符串时无能为力,可以重载一个非模板函数,如:
const char * max(const char *a, const char *b) {

    return strcmp(a, b) > 0 ? a : b;

}
也可以特化模板函数,如:

template <>
const char * max(const char *a, const char *b) {

    return strcmp(a, b) > 0 ? a : b;

}

这两种方式实现同样的功能,但是那种更好的?一种语言竟然能用两种方法实现同一件事,不只是好还是坏。呵呵。

论坛徽章:
0
2 [报告]
发表于 2007-11-28 21:08 |只看该作者
无所谓好或者不好。
这个问题BT,“模板”这个东西,最大的好处是带来了“通用”性,不是为了拿来做你上面的这些无聊比较的。某些情况下,你不得不用特化的方式。

论坛徽章:
0
3 [报告]
发表于 2007-11-28 22:12 |只看该作者
对于模版函数和特例函数,如果参数个数不同,可能重载是唯一的手段;如果参数个数一致,优先使用特化。

论坛徽章:
0
4 [报告]
发表于 2007-11-28 23:15 |只看该作者
一种语言竟然能用两种方法实现同一件事
-------------------------------------------
楼主不了解perl的格言啊---   TIMTOWTDI

论坛徽章:
0
5 [报告]
发表于 2007-11-29 09:13 |只看该作者
特化版本不参加重载决议,只有在没有重载的情况下,才会匹配到.
优先使用重载版本

论坛徽章:
0
6 [报告]
发表于 2007-11-29 09:16 |只看该作者
呵呵,可能是我的知识太陈旧了吧,只是在最近才接触到C++的模板特化,以前从来没有用过。所以提出的问题比较幼稚,也让各位高人见笑了。

在此非常感谢whyglinux的回答,这是我想要的答案。呵呵。

论坛徽章:
0
7 [报告]
发表于 2007-11-30 18:39 |只看该作者
我也是前几天看到特化模板。whyglinux说的的 ”对于模版函数和特例函数,如果参数个数不同,可能重载是唯一的手段;如果参数个数一致,优先使用特化。“,是针对楼主模板template<typenate T> max() 和 完全特化版本的template<>max,如果有一般的函数max()存在且参数符合应用,如楼主的max(char*,char*)版本,应用程序优先选择一般函数,一下为测试代码,环境为linux 2.6
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
template<class T>
T maxx(T& a,T& b)
{
        cout<<"template<class T> char* maxx(char* a,char* b)"<<endl;
        return a>b?a:b;
}
const char* maxx(char* a,char* b)
{
        cout<<"char* maxx(char* a,char* b)"<<endl;
                if(strcmp(a,b))return a;
        return b;
}

template<>
const char* maxx(const char* &a,const char* &b)
{
        cout<<"template<> char* maxx(char* a,char* b)"<<endl;
        if(strcmp(a,b))return a;
        return b;
}


int main()
{
        char* a="abc",*b="ssd";
        cout<<maxx(a,b)<<endl;
        return 0;
       
}

最后输出为:
char* maxx(char* a,char* b)
abc
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP