模板元编程之函数模板(一)
一、概述
函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用,换句话说函数模板代表一个函数家族,它的表示看起来和普通的函数很相似,唯一的区别就是有些函数元素是未确定的,这些元素将在使用时被参数化。
下面是一个返回两个值中最大者的函数模板
template <typename T> inline T const& Max_Func(T const& a, T const& b) { return a < b ? b : a; }
这个模板定义了一个“返回两个值中最大者”的函数家族,两个值是通过函数参数a和b传递给该函数模板的;而参数的类型还没确定,用模板参数T来代替。
模板参数必须用如下形式的语法来声明:
template <用逗号隔开的参数列表>
在上面的程序中,类型参数是T,可以使用任何标识符作为类型参数的名称,但使用T已经成为了一种惯例,类型参数T表示的是,调用者调用这个函数时所指定的任意类型,可以使用任何类型(基本类型,类等)来实例化该类型参数,只要所用类型提供模板使用的操作就可以,例如上面的这个例子,类型T需要支持operator<,因为a和b就是使用这个运算符来比较大小的。
二、函数模板
1.1 模板的使用
#include <iostream> template <typename T> inline T const& Max_Func(T const& a, T const& b) { return a < b ? b : a; } int main() { int a = 110, b = 200; std::cout << "Max_Func(a, b):" << Max_Func(a, b) << std::endl; double d1 = 1.5, d2 = 3.8; std::cout << "Max_Func(d1, d2):" << Max_Func(d1, d2) << std::endl; std::string s1 = "abcdefg", s2 = "abc"; std::cout << "Max_Func(s1, s2):" << Max_Func(s1, s2) << std::endl; return 0; }
打印结果:

2.2 实参的推导
当我们为某些实参调用一个诸如Max_Func()的模板时,模板参数可以由我们所传递的实参来决定的,如果我们传递了两个int给参数类型T const&,那么编译器能够得出结论:T必须是int,注意,这里不允许进行自动类型转换,每一个T都必须正确的匹配,如:
template <typename T> inline T const& Max_Func(T const& a, T const& b) { return a < b ? b : a; } Max_Func(3, 8); //OK:两个实参的类型都是int Max_Func(4, 4.9); // ERROR:第一个T是int,而第二个T是double
有两种方法可以解决上面的错误,可以显示指定(或者限定)T的类型
Max_Func<double>(a, d1);
(1).对实参进行强制类型转换,使它们可以互相匹配:Max_Func{static_cast<double>}