My_tools.h
#include<iostream> using namespace std; template <class T> T My_min(T t1, T t2); template <typename T> T My_max(T t1, T t2); template <class T> void Swap(T t1, T t2);
My_tools.cpp
#include "My_tools.h" // 函数模板 // typename 和 class 关键字在这里作用是相同的,含义都是声明一个类型。因此可替换使用 template <class T> inline T My_min(T t1, T t2) { return t1<t2?t1:t2; } template <class T> inline T My_max(T t1, T t2) { return t1>t2?t1:t2; } template <typename T> void Swap(T t1, T t2) { T temp; temp = t1; t1 = t2; t2 = temp; } // 单个参数类模板 template <class T> class Single { private: T t; public: Single(T t) : t(t){}; void print() { cout << t << endl; } }; // 两个参数类模板 template <class T1, class T2> class Pair { private: T1 key; T2 value; public: Pair(T1 t1, T2 t2) : key(t1), value(t2) {}; void print() { cout << "key: " << key << " value: " << value << endl; } // 模板类成员函数声明实现分离 (实际意义不大,一般都写在一起) void print_2(); }; template <class T1, class T2> void Pair<T1,T2>::print_2() { cout << "print_2 " << "key: " << key << " value: " << value << endl; } // 类模板嵌套函数模板 template <class T> class A { public: template <class U> void Func1(U u) { cout << u << endl; } // 模板类、成员函数模板 声明与实现分离:没有这种操作 // template <class U> // void Func2(U u); }; // template <class T> void A<T>::template <class U> Func2(U u) { // cout << u << endl; // }
tools.cpp
# include <iostream> # include "My_tools.cpp" using namespace std; int main() { int a = 1; int b = 2; Swap(a,b); cout << "Swap: " << a << " " << b << endl; cout << "min: " << My_min<double>(a,b) << " " << endl; Single<int> s(666); s.print(); Pair<float,char> pair(101,'b'); pair.print(); pair.print_2(); A<int> c; c.Func1(123); c.Func1("asdf"); return 0; }
模板的几种用法
// 1、泛化单个参数 template <class T> class T_class { T t; } // 2、两个参数 template <class T1, class T2> class T_class { T1 t1; T2 t2; } // 3、传参 template <class T, int N> class T_class { int length; T_class() { length = N; } } // 4、全特化 (对应例1) template <> class T_class<int> { T t; } // 5、偏特化 (对应例2) template <class T1> class T_class<T1, int> { T1 t1; int t2; } // 6、默认值 template <class T=int> class T_class { }