一、函数模板
1.为什么使用模板
模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性
#include <iostream> using namespace std; template<typename T> void MySwap(T& a, T& b) { T temp = a; a = b; b = temp; } void test01() { int a = 10, b = 20; //自动类型推导 MySwap(a, b); cout << "a = " << a << ", b = " << b << endl; double da = 1.23, db = 4.56; MySwap(da, db); cout << "da = " << da << ", db = " << db << endl; //显式指定类型 MySwap<int>(a, b); cout << "a = " << a << ", b = " << b << endl; MySwap<double>(da, db); cout << "da = " << da << ", db = " << db << endl; } int main() { test01(); return 0; }
2.函数模板和普通函数的区别
函数模板不允许自动类型转化,普通函数能够进行类型转化
3.函数模板和普通函数在一起时的调用规则
函数模板可以重载
C++编译器优先考虑普通函数
如果模板可以产生一个更好的匹配,那么选择模板
可以通过空模板实参列表的语法限定编译器只能通过模板匹配
#include <iostream> using namespace std; //函数模板必须严格类型匹配 template <typename T> int MyAdd(T a, T b) { return a + b; } //普通函数可以进行自动类型转化 int MyAdd(int a, char c) { return a + c; } int MyAdd(int a, int b) { return a + b; } void test01() { int a = 10, b = 20; char c1 = 'a', c2 = 'b'; MyAdd(a, c1); //调普通函数 MyAdd(a, b); //调普通函数 MyAdd(c1, b); //模板不允许自动类型转换,调普通函数, MyAdd<>(a, b); //使用空模板实参列表,限定编译器用模板匹配 } //函数模板可以向普通函数那样重载 template<typename T> void Print(T a) {} template<typename T> void Print(T a, T b) {} int main() { test01(); return 0; }