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++为了解决这类问题,提供了函数模版函数的重载,可以为特定的类型提供具体化的模版(还有另一种解决方式:操作符重载)。
浙公网安备 33010602011771号