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 {
}