1. 函数模板
template <typename T> T larger(T a, T b) { return a > b ? a : b; }
2. 创建函数模板的实例
3. 模板类型参数
template <typename T> const T& larger (const T& a, const T& b) { return a > b ? a : b; }
4. 显示指定模板实参
5. 函数模板的特例(指针参数)
template <> int * larger<int *> (int *a, int *b) { return *a > *b ? a : b; }
6. 函数模板和重载
7. 带有多个参数的函数模板
template <typename T1, typename T2> ??? larger(T1, T2) // 实际定义时返回值需要再定义模板参数,但编译器仍然无法推断出返回值类型 { return a > b ? a : b; }
template <typename TReturn, typename T1, typename T2>
TReturn larger(T1, T2) // 实际定义时返回值需要再定义模板参数,但编译器仍然无法推断出返回值类型
{
return a > b ? a : b;
}
8. 函数模板的返回类型推断
// decltype(拖尾类型)在函数模板中的应用 // step 1:编译失败,编译器从左往右处理模板,未能提前知道a和b的类型 template <typename T1, typename T2> decltype(a>b?a:b) larger (T1 a, T2 b) { return a > b ? a : b; } // step 2: 拖尾类型,auto告诉编译器需要推断返回值类型 template <typename T1, typename T2> auto larger (T1 a, T2 b) -> decltype (a > b ? a : b) { return a > b ? a : b; } // step 3: 在模板内部使用decltype关键字 template <typename T1, typename T2> auto vector_product(const std::vector<T1>& data1, const std::vector<T2>& data2) { const auto count = std::min(data1.size(), data2.size()); decltype(data1[0] * data2[0]) sum {}; for(size_t i {}; i < count; ++i) sum += data1[i] * data2[i]; return sum; }
template <typename T1, typename T2> decltype(auto) larger(T1 a, T2 b) { return a > b ? a : b; }
9. 模板参数的默认值
10. 非类型的模板参数
template <typename T, int lower, int upper> bool is_in_range(const T& value) { return (value <= upper) && (value >= lower); } //调用方式 std::cout << is_in_range<double, 0, 500> (value); // 优化写法 template <int lower, int upper, typename T> bool is_in_range(const T& value) { return (value <= upper) && (value >= lower); } // 调用如下,这样编译器可以推断实参类型 std::cout << is_in_range<0, 500> (value);
template <typename T, size_t N> T average(const T (&array) [N]) { T sum {}; for (size_t i {}; i < N; i++) sum += array[i]; return sum/N; }
原文:https://www.cnblogs.com/yangdadahome/p/15077799.html