在实例化类模板时,需要在尖括号中间指明类型;但是在实例化函数模板时,可以不写尖括号极其内部类型,因为函数模板具有参数类型推断功能。如下:
#include <iostream>
using namespace std;
template<typename T> const T& my_min(const T& a, const T& b) {
return (a < b) ? a : b;
}
int main()
{
int x = 3;
int y = 4;
int z = my_min(x, y);
int i = 3;
double j = 4;
int k0 = my_min(i, j);
int k1 = my_min<int>(i, j);
}
当输入参数为同一类型时,实例化函数模板时不必写尖括号极其类型,函数模板会根据输入参数的类型进行type deduction, 如:
<pre name="code" class="cpp">int x = 3;
int y = 4;
int z = my_min(x, y);
但是,当输入参数的类型不一致时,函数模板则无法推断类型,程序会报错,如:
int i = 3;
double j = 4;
int k0 = my_min(i, j);
这时需要使用尖括号,并在其内部指定类型,如:
int k1 = my_min<int>(i, j);
函数模板还可以推断出数组的大小(dimensions), 当数组以指针或引用传递时,会附带数组大小信息,如下:
//: C05:ArraySize.cpp
#include <cstddef>
using std::size_t;
template<size_t R, size_t C, typename T>
void init1(T a[R][C]) {
for(size_t i = 0; i < R; ++i)
for(size_t j = 0; j < C; ++j)
a[i][j] = T();
}
template<size_t R, size_t C, class T>
void init2(T (&a)[R][C]) { // Reference parameter
for(size_t i = 0; i < R; ++i)
for(size_t j = 0; j < C; ++j)
a[i][j] = T();
}
int main() {
int a[10][20];
init1<10,20>(a); // Must specify
init2(a); // Sizes deduced
} ///:~
参考:Bruce Eckel. Thinking In C++ Volume 2: Practical Programming. page242.