C++ Template初识函数模板(2.1节,2.2节)

C++模板是泛型编程基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
为什么要使用模板,有哪些好处呢,首先来看下面一个示例
    

#include 

using namespace std;

int max(int a, int b)
{
    return a > b ? a : b;
}

float max(float a, float b)
{
    return a > b ? a : b;
}

double max(double a, double b)
{
    return a > b ? a : b;
}

char max(char a, char b)
{
    return a > b ? a : b;
}

int main()
{
    cout << "int    ret == " << max(10, 20) << endl;
    cout << "double ret == " << max(19.5, 8.5) << endl;
    cout << "float  ret == " << max(10.6f, 29.7f) << endl;
    cout << "char   ret == " << max('A', 'd') << endl;
    cout << "Hello World!" << endl;
    return 0;
}


     同样是比较大小的函数,功能一样,只是因为类型不同就得定义每种类型的函数,代码量变得冗余盘杂。而C++模板则可以解决类似的这种问题。模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。当使用模板的时候,你只需要把所希望的类型作为一个(显式或者隐式的)实参传递给模板,另外,则于模板是语言本身所具有的特性,所以它完全支持类型检查和作用域。

模板的定义
    
    template
    ret-type func-name(parameter list)
    {
       // 函数的主体
    }

template  
返回类型 函数名(参数列表)
{
  函数体
}

typename也可以用class代替,为了区分类模板,我们统一用typename.

1.函数模板的使用

#include 

using namespace std;

template 
T const& tmax(T const &a, T const &b)
{
    return a > b ? a : b;
}

int main()
{
    int i = 10;
    int j = 20;
    double d1 = 19.5;
    double d2 = 8.5;
    float f1 = 10.6f;
    float f2 = 29.7f;
    char c1 = 'A';
    char c2 = 'd';
    cout << "int    tmax ret == " << tmax(i, j) << endl;
    cout << "double tmax ret == " << tmax(d1, d2) << endl;
    cout << "float  tmax ret == " << tmax(f1, f2) << endl;
    cout << "char   tmax ret == " << tmax(c1, c2) << endl;
    cout << "Hello World!" << endl;
    return 0;
}

运行结果是一样的

 

2.实参的演绎

当我们为某些实参调用一个诸如max()的模板时,模板参数可以由我们所传递的实参来问心有愧定。如果我们传递了两个int给参数类型T const&,那么C++编译器能够得出结论:T必须是int,这里不允许进行自动类型转换,每个T都必须正确地匹配。列如:

tmax(4, 8.5);//错误,第一个为int, 第二个为double没有匹配的函数

解决这类问题有三种方式

1:对实参进行强制类型转换,使它们可以互相匹配

cout << "tmax ret == " << tmax(static_cast(4), d2) << endl;

2:显示指定T的类型:

cout << "tmax ret == " << tmax(4, d2) << endl;

3.指定两个参数可以具有不同的类型。后续介绍

C++ Template初识函数模板(2.1节,2.2节)_第1张图片

 

 

 

你可能感兴趣的:(C++,template学习笔记,C++,template)