C++中重要的编程思想之一,泛型编程,他主要使用到的就是模版。

模版分成函数模版和类模版,这里主要介绍函数模版。

函数模版语法

template<typename T>void MySwap(T &a, T &b)
{
    T c;
    c = a;
    a = b;
    b = c;
}

在函数前使用关键字template申明这是个模版函数,<>中关键字typename(这个关键字也可以使用class,两者没有区别)定义一个类型T(不一定非要是T,也可以是A,B,C....),这个T在你使用函数前不会确定类型,只有你调用了函数,编译器才会去确定T的类型。

例如:

int a = 10, b = 20;
//自动推导类型
MySwap(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;

float c = 1.45, d = 1.67;
//显式指定类型
cout << "c+d=" << MyAdd<float>(c,d) << endl;

编译器确定T的类型时如上有两种方式:

1.自动推导类型

2.显式指定类型

普通函数和函数模版函数的一些区别

1.普通函数可以发生隐式类型转换

2.函数模版函数自动推导类型的情况下不能发生隐式类型转换

3.函数模版函数显式指定类型的情况下可以发生隐式类型转换

普通函数和函数模版函数的调用规则

1.如果函数模版函数和普通函数都可以实现,优先调用普通函数

2.可以通过空模版参数列表来强制调用函数模版函数,例如:MySwap<>(a,b)

3.函数模版可以发生重载

4.如果函数模版函数可以产生更好的匹配,优先调用函数模版

总结:既然提供了函数模版函数,最好不要提供普通函数,否则容易出现二义性。

模版的局限性

模版并不是万能的,例如函数模版函数做赋值操作是,传入的参数是数组或一个类时就无法实现。

C++为了解决这类问题,提供了函数模版函数的重载,可以为特定的类型提供具体化的模版(还有另一种解决方式:操作符重载)。