C++中的函数模版

函数模版

语法结构

template <template_parameter_list>
[ inline | const_expr] func_name( func_parameter_list){
   ...
}

template_parameter_list不能为空,多个template parameter之间用','来分隔。template parameter分为两种:type parameter和nontype parameter。

  1. type paramter
    语法形式 typename | class type_name
    其中'typename'关键字和'class'关键字是等价的。推荐使用typename,因为模版适用的类型不仅仅是class,用typename表意更准确一些。
  2. nontype parameter
    语法形式 type value_name
    type在定义模版的时候必须指定,而value_name在模版体中作为一个常量来使用。在使用模版的时候,传进来的必须是常量表达式,比如常数、const指针或引用以及函数。

常见的函数模版示例

template<typename T>
int compare(const T& v1, const T& v2){
    if(less<T>()(v1, v2))
        return 1;
    if(less<T>()(v2, v1))
        return -1;
    return 0;
}
template<int M, int N>
int compare(const char v1[M], const char v2[N]){
    return strcmp(v1, v2);
}

NOTE: 定义模版的时候,应该尽可能少一些限定,以便适用面更广。