泛型编程 函数模板
泛型编程
如何实现一个通用的交换函数呢?
使用函数重载虽然可以实现,但是有一下几个不好的地方:
- 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数
- 代码的可维护性比较低,一个出错可能所有的重载均出错
函数模板:
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
1.函数模板格式:
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}
template <typename T>
void Swap( T& left, T& right) { T temp = left; left = right; right = temp; }
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
2.函数模版会根据传入的参数推导出参数类型生成该类型的模板函数,实际运行的是模版函数,因此使用模版效率会降低。若重载的函数与传递的参数更加匹配会优先调用重载函数。