C++中怎么做才可以无需提供模板原型

C++中怎么做才可以无需提供模板原型

在有些情况下,可通过编写合适的函数调用,引导编译器做出您希望的选择。请看程序清单8.15,该程序将模板函数定义放在文件开头,从而无需提供模板原型。与常规函数一样,通过在使用函数前提供模板函数定义,它让它也充当原型。

// choices.cpp -- choosing a template
#include <iostream>

template<class T>
T lesser(T a, T b)         // #1
{
    return a < b ? a : b;
}

int lesser (int a, int b)  // #2
{
    a = a < 0 ? -a : a;
    b = b < 0 ? -b : b;
    return a < b ? a : b;
}

int main()
{
    using namespace std;
    int m = 20;
    int n = -30;
    double x = 15.5;
    double y = 25.9;

    cout << lesser(m, n) << endl;       // use #2
    cout << lesser(x, y) << endl;       // use #1 with double
    cout << lesser<>(m, n) << endl;     // use #1 with int
    cout << lesser<int>(x, y)  << endl; // use #1 with int

    // cin.get();
    return 0;
}

最后的函数调用将double转换为int,有些编译器会针对这一点发出警告。该程序的输出如下:

20
15.5
-30
15

程序清单 8.15 提供了一个模板和一个标准函数,其中模板返回两个值中较小的一个,而标准函数返回两个值中绝对值较小的那个。如果函数定义是在使用函数前提供的,它将充当函数原型,因此这个示例无
需提供原型。参见【0voice C++】请看下面的语句:

cout << lesser(m,n) << endl;  // use #2

这个函数调用与模板函数和非模板函数都匹配,因此选择非模板函数,返回20。接下来,下述语句中的函数调用与模板匹配(T为double):

cout << lesser(x,y) << endl; //use #l with double

现在来看下面的语句:

cout << lesser<>(m,n) << endl; // use #l with int

lesser>(m,n)中的<> 指出,编译器应选择模板函数,而不是非模板函数;编译器注意到实参的类型为因此使用int替代T对模板进行实例化。
最后,请看下面的语句:

cout << lesser<int>(x,y) << endl; //use #l with int

这条语句要求进行显式实例化(使用int替代 T),将使用显式实例化得到的函数。x和y的值将被强制转换为 int,该函数返回一个 imnt 值,这就是程序显示 15 而不是 15.5 的原因所在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值