模板的概念
模板(template)是实现泛型编程(与类型无关的逻辑代码)的基础条件
函数模板
申明及使用案例
template <typename T1, class T2>
void test(T1 t1, T2 t2) {
cout << "add======" << t1 + t2 << endl;
}
add(1,2);
add<int>(3,5.44);
template <typename Type>
void add(Type t1, Type t2) {
cout << "add======" << t1 + t2 << endl;
}
test(1.4, 2.5);
test<double>(1.4, 2.5);
模板函数(更好的匹配)与全局函数
重载函数模板解决除基本类型的计算
类模板
//类模板
template <class T1,class T2>
class MyClass
{
public:
MyClass(T1 n,T2 v):num(n),val(v) {}
T1 getNum(T1 n) {
num = n;
std::cout << " getNum =========" << num << endl;
}
T2 setVal(T2 v) {
val = v;
std::cout << " setVal ============" << val << endl;
}
void show();
private:
T1 num;
T2 val;
};
template<typename Type1,typename Type2>
void MyClass<Type1, Type2>::show() {
std::cout << " num =" << num << endl;
std::cout << " val =" << val << endl;
}
//调用
MyClass<char,int> obj(67,5);
obj.show();
类模板做参数
template<typename Type1, typename Type2>
void test(MyClass<Type1, Type2>& obj) {
obj.show();
}
template<typename T>
void fun(T &obj) {
obj.show();
}
//调用
MyClass<char,int> obj(67,5);
obj.show();
std::cout << "---------------------" << endl;
MyClass<double, int> obj2(67.434, 5);
test(obj);
test(obj2);
std::cout << "---------------------" << endl;
fun(obj);
fun(obj2);
模板类的继承
模板一般后缀为.hpp(申明与实现需要放在一起)
类模板使用友元函数时,最好申明与实现在一起放在类里面;如果申明在内,实现在外,需要在最前面申明类模板与类模板的友元函数