函数模板(二)

又到了我最喜欢的学习语言的时间了 好开心啊!!!

显式具体化:
struct job
{
    char name[40];
    double salary;
    int floor;
};
***C++允许将一个结构赋给另一个结构。
第三代具体化:
*对于给定的函数名,可以有非模板函数,模板函数和显式具体化模板函数以及他们的重载版本。
*显式具体化的原型和定义应以template<>打头,并通过名称来指出类型。
*具体化将覆盖常规模板,而非模板函数将覆盖具体化和常规模板。
下面是用于交换job结构的非模板函数,模板函数和具体化的原型:
///non_template function prototype
void Swap(job &, job &);
///template prototype
template<class Any>
void Swap(Any &, Any &);
///explicit specialization for the job type
template <> void Swap<job>(job &, job &);
若有多个原型,非模板版本将优先于显式具体化和模板版本,而显式具体化将优先于使用模板生成的版本。
例如,在下面的代码中,第一次调用Swap()时使用通用版本,而第二次使用基于job类型的显式具体化版本。
template<class Any>
void Swap(Any &, Any &);
///explicit specialization for the job type
template <> void Swap<job>(job &, job &)
int main()
{
    double u, v;
    ...
    Swap(u, v);
    job a, b;
    ...
    Swap(a, b);
}
Swap<job>中的<job>是可选的,因为函数的参数类型表明,这是job的一个具体化。
该原型也可这样写:
template <> void Swap(job &, job &);

*****************************************************************************************************
                       yomi自制  :  华丽的分割线
*****************************************************************************************************
看个小程序吧:
#include<iostream>
using namespace std;
template <class Any>
void Swap(Any &a, Any & b);

struct job
{
    char name[40];
    double salary;
    int floor;
};

template <> void Swap<job> (job &j1, job &j2);
void Show(job &j);
int main()
{
    cout.precision(2);
    cout.setf(ios:: fixed, ios:: floatfield);
    int i=10,j = 20;
    cout << "i, j = " << i << ", " << j << ".\n";
    cout << "Using compiler_generated int swapper: \n";
    Swap(i, j);
    cout << "Now i, j = " << i << ", " << j << ".\n";

    job sue = {"Susan Yaffee", 73000.606, 7};
    job sidney = {"Sidney Taffee", 78060.726, 9};
    cout << "Before job swapping: \n";
    Show(sue);
    Show(sidney);
    Swap(sue, sidney);
    cout << "After job swapping: \n";
    Show(sue);
    Show(sidney);
    return 0;
}
template <class Any>
void Swap(Any &a, Any &b)
{
    Any temp;
    temp = a;
    a = b;
    b = temp;
}
/// swap just salary and floor fields of a job structure

template <> void Swap<job> (job &j1, job &j2)
{
    double t1;
    int t2;
    t1 = j1.salary;
    j1.salary = j2.salary;
    j2.salary = t1;
    t2 = j1.floor;
    j1.floor = j2.floor;
    j2.floor = t2;
}
void Show(job &j)
{
    cout << j.name << ": $" << j.salary << " on floor " << j.floor << endl;
}

/*
i, j = 10, 20.
Using compiler_generated int swapper:
Now i, j = 20, 10.
Before job swapping:
Susan Yaffee: $73000.61 on floor 7
Sidney Taffee: $78060.73 on floor 9
After job swapping:
Susan Yaffee: $78060.73 on floor 9
Sidney Taffee: $73000.61 on floor 7

Process returned 0 (0x0)   execution time : 5.840 s
Press any key to continue.

*/

ok , 今天对于C++的学习到此结束。 最近为了准备省赛都没怎么学C++, 不开森!!! 不管怎么说,
我会尽量抽时间的。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值