中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
用template来替代重载
作者:未知 时间:2005-07-27 23:20 出处:CSDN 责编:chinaitpower
              摘要:用template来替代重载

by Yazy -- 2005, 04.23

如果我们要实现一个支持多种输入类型的函数,在C++里我们可以
使用“重载”:
    void test(int n)
    {
        cout<<"test(int): "<<n<<endl;
    }

    void test(float n)
    {
        cout<<"test(float): "<<n<<endl;
    }

    void test(short n)
    {
        cout<<"test(short): "<<n<<endl;
    }
重载的思想是为每一种特定的类型去实现一个函数实体。这种方
式可能会给函数的使用者带来极大的便利,这种便利体现在用户
只须记住一个函数,而不必去为不同的类型选用其特定的函数调
用,因为“重载”的实现方式将这种“选择”定性地交给了编绎
器做了。所以“重载”是有助于用户使用函数来开发程序的,有
助于代码复用效率。

而重载的缺点是:它加重了函数开发者的开发负担。按“以用户
为中心”的思想,重载牺牲开发者更多的时间与精力,换来更多
的用户利益。函数作者需要负出更多的努力,体现于作者要写多
个版本的同一个函数;作者要保证函数的每一个版本都具有正确
或者通常是一致的语义。可能开发者要为这个保证负出更多,有
时候复杂的问题使得这种保证变得不那么有意义。

C++的template可以将要用到的类型泛化。比如在一个函数可能用
到一种未确知的类型 T,它可能是 int、float、short 或是某个
自定义类型。Template 可以让开发者使用这种“未知”,将这种
“未知”状态保留至函数被使用并且代码被编绎。 这种“未知”
的类型便是“泛化的类型”,使用这种编程范式的程序被称作“
泛型程序”。

上面的 test 使用泛型编程方式来作便可能是:
    template<class T>
    void test(T n)
    {
        cout<<"template<class T> void test(T): "<<n<<endl;
    }

相比于“重载”,泛型的函数可以应用于更多的类型,甚至常常很难
确定它可以被用于多少种类型,而重载函数通常被使用于极有限数量
的类型。

泛型函数通常只要求输入类型符合某些特性,而不理会其具体是什么
类型。例如,某个泛型函数可能要求输入类型必须可以参加算术运算、
逻辑运算或是某种接口(例如 STL 里的 iterator)。

在C++里泛型还可以“泛”常数,即将“未知”状态赋予一种常数:
    template<class T, int SIZE>
    void test(T n)
    {
        int nums[SIZE];
        //...
        cout<<"Size: "<<SIZE<<endl
            <<"Para: "<<n<<endl;
    }

泛型还包括:默认模板参数、特化等。有待学习……


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有