16.1.1 定义函数模板
使用template+模板参数列表来定义一个函数模板。
template<typename T>
bool compare(const T&a,const T&b){
return a<b;
}
compare(1,1);
在具体调用时,会根据传入的实参类型,将函数模板中的模板参数替换掉,转换为一个具体的函数实例。 这个过程叫做实例化。函数模板可以根据传入的实参类型推断出模板参数类型,前提是所有的模板参数类型都用到,我们也可以自己指定参数类型。
compare<int,int>(1,1);
我们可以使用typename和class声明模板参数,但是一般使用typename,因为这样更加的清晰,class是旧版本遗留下来的。
使用typename和class声明的参数模板是一个类型,但是这个类型具体是什么要在根据传入的实参类型来确定。我们还可以当以非类型模板参数,非类型模板参数它本身就已经是一个具体的类型的变量了,这个值由用户提供或者编译器推断。
下面的调用方式就是由编译器自己推断得出的,用来获取数组的大小。
template<typename value_type, unsigned arr_size>
constexpr unsigned get_arr_size(value_type(&arr)[arr_size]) {
return arr_size;
}
int a[] = {
1,2,3,4,54,56};
int b[get_arr_size